Re: tekhex object file output fixes

Commit 8b5a212495 supported *ABS* symbols by allowing "section" to be
bfd_abs_section, but bfd_abs_section needs to be treated specially.
In particular, bfd_get_next_section_by_name (.., bfd_abs_section_ptr)
is invalid.

	PR 32347
	* tekhex.c (first_phase): Guard against modification of
	_bfd_std_section[] entries.
This commit is contained in:
Alan Modra 2024-11-11 10:24:09 +10:30
parent 912f10fba9
commit e032307191

View File

@ -361,6 +361,7 @@ first_phase (bfd *abfd, int type, char *src, char * src_end)
{
asection *section, *alt_section;
unsigned int len;
bfd_vma addr;
bfd_vma val;
char sym[17]; /* A symbol can only be 16chars long. */
@ -368,20 +369,16 @@ first_phase (bfd *abfd, int type, char *src, char * src_end)
{
case '6':
/* Data record - read it and store it. */
{
bfd_vma addr;
if (!getvalue (&src, &addr, src_end))
return false;
if (!getvalue (&src, &addr, src_end))
return false;
while (*src && src < src_end - 1)
{
insert_byte (abfd, HEX (src), addr);
src += 2;
addr++;
}
return true;
}
while (*src && src < src_end - 1)
{
insert_byte (abfd, HEX (src), addr);
src += 2;
addr++;
}
return true;
case '3':
/* Symbol record, read the segment. */
@ -406,13 +403,16 @@ first_phase (bfd *abfd, int type, char *src, char * src_end)
{
case '1': /* Section range. */
src++;
if (!getvalue (&src, &section->vma, src_end))
if (!getvalue (&src, &addr, src_end))
return false;
if (!getvalue (&src, &val, src_end))
return false;
if (val < section->vma)
val = section->vma;
section->size = val - section->vma;
if (bfd_is_const_section (section))
break;
section->vma = addr;
if (val < addr)
val = addr;
section->size = val - addr;
/* PR 17512: file: objdump-s-endless-loop.tekhex.
Check for overlarge section sizes. */
if (section->size & 0x80000000)
@ -455,6 +455,8 @@ first_phase (bfd *abfd, int type, char *src, char * src_end)
new_symbol->symbol.flags = BSF_LOCAL;
if (stype == '2' || stype == '6')
new_symbol->symbol.section = bfd_abs_section_ptr;
else if (bfd_is_const_section (section))
;
else if (stype == '3' || stype == '7')
{
if ((section->flags & SEC_DATA) == 0)