forked from Imagelibrary/binutils-gdb
objcopy renaming section with explicit flags
This tidies SEC_RELOC handling in bfd, in the process fixing a bug with objcopy when renaming sections. bfd/ * reloc.c (_bfd_generic_set_reloc): Set/clear SEC_RELOC depending on reloc count. * elf64-sparc.c (elf64_sparc_set_reloc): Likewise. binutils/ * objcopy.c (copy_relocations_in_section): Remove now unnecessary clearing of SEC_RELOC. * testsuite/binutils-all/rename-section-01.d: New test. * testsuite/binutils-all/objcopy.exp: Run it. gas/ * write.c (size_seg): Remove unneccesary twiddle of SEC_RELOC. (write_relocs): Likewise. Always call bfd_set_reloc.
This commit is contained in:
@@ -322,6 +322,10 @@ elf64_sparc_set_reloc (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
{
|
||||
asect->orelocation = location;
|
||||
canon_reloc_count (asect) = count;
|
||||
if (count != 0)
|
||||
asect->flags |= SEC_RELOC;
|
||||
else
|
||||
asect->flags &= ~SEC_RELOC;
|
||||
}
|
||||
|
||||
/* Write out the relocs. */
|
||||
|
||||
@@ -8706,6 +8706,10 @@ _bfd_generic_set_reloc (bfd *abfd ATTRIBUTE_UNUSED,
|
||||
{
|
||||
section->orelocation = relptr;
|
||||
section->reloc_count = count;
|
||||
if (count != 0)
|
||||
section->flags |= SEC_RELOC;
|
||||
else
|
||||
section->flags &= ~SEC_RELOC;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -4331,10 +4331,7 @@ copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
|
||||
}
|
||||
|
||||
if (relsize == 0)
|
||||
{
|
||||
bfd_set_reloc (obfd, osection, NULL, 0);
|
||||
osection->flags &= ~SEC_RELOC;
|
||||
}
|
||||
bfd_set_reloc (obfd, osection, NULL, 0);
|
||||
else
|
||||
{
|
||||
if (isection->orelocation != NULL)
|
||||
@@ -4377,8 +4374,6 @@ copy_relocations_in_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
|
||||
}
|
||||
|
||||
bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
|
||||
if (relcount == 0)
|
||||
osection->flags &= ~SEC_RELOC;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1448,3 +1448,5 @@ if { [istarget *-*-cygwin] || [istarget *-*-mingw*] } {
|
||||
if { ![is_xcoff_format] } {
|
||||
objcopy_test "pr25662" $src executable "" $ldflags
|
||||
}
|
||||
|
||||
run_dump_test "rename-section-01"
|
||||
|
||||
14
binutils/testsuite/binutils-all/rename-section-01.d
Normal file
14
binutils/testsuite/binutils-all/rename-section-01.d
Normal file
@@ -0,0 +1,14 @@
|
||||
#PROG: objcopy
|
||||
#name: objcopy rename-section with flags - keep relocation
|
||||
#source: needed-by-reloc.s
|
||||
#objcopy: --rename-section .data=myrodata,contents,alloc,load,readonly
|
||||
#objdump: -r
|
||||
#notarget: alpha*-*-*vms* rx-*-elf [is_som_format] [is_aout_format]
|
||||
|
||||
.*: +file format .*
|
||||
|
||||
#...
|
||||
RELOCATION RECORDS FOR .*myrodata.*:
|
||||
OFFSET +TYPE +VALUE
|
||||
0+ .*
|
||||
#pass
|
||||
@@ -579,7 +579,6 @@ size_seg (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *xxx ATTRIBUTE_UNUSED)
|
||||
if (size > 0 && ! seginfo->bss)
|
||||
flags |= SEC_HAS_CONTENTS;
|
||||
|
||||
flags &= ~SEC_RELOC;
|
||||
x = bfd_set_section_flags (sec, flags);
|
||||
gas_assert (x);
|
||||
|
||||
@@ -1385,13 +1384,7 @@ write_relocs (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
|
||||
}
|
||||
#endif
|
||||
|
||||
if (n)
|
||||
{
|
||||
flagword flags = bfd_section_flags (sec);
|
||||
flags |= SEC_RELOC;
|
||||
bfd_set_section_flags (sec, flags);
|
||||
bfd_set_reloc (stdoutput, sec, relocs, n);
|
||||
}
|
||||
bfd_set_reloc (stdoutput, sec, n ? relocs : NULL, n);
|
||||
|
||||
#ifdef SET_SECTION_RELOCS
|
||||
SET_SECTION_RELOCS (sec, relocs, n);
|
||||
|
||||
Reference in New Issue
Block a user