mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-09-10 14:59:31 +08:00
Remove relocation against discarded sections for relocatable link.
bfd/ 2010-04-30 H.J. Lu <hongjiu.lu@intel.com> PR ld/11542 * elf-bfd.h (RELOC_AGAINST_DISCARDED_SECTION): New. * elf32-i386.c (elf_i386_relocate_section): Use it. * elf64-x86-64.c (elf64_x86_64_relocate_section): Likewise. ld/testsuite/ 2010-04-30 H.J. Lu <hongjiu.lu@intel.com> PR ld/11542 * ld-elf/discard.ld: New. * ld-elf/discard1.d: Likewise. * ld-elf/discard1.s: Likewise. * ld-elf/discard2.d: Likewise. * ld-elf/discard2.s: Likewise. * ld-elf/discard3.d: Likewise.
This commit is contained in:
@ -1,3 +1,11 @@
|
|||||||
|
2010-04-30 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
PR ld/11542
|
||||||
|
* elf-bfd.h (RELOC_AGAINST_DISCARDED_SECTION): New.
|
||||||
|
|
||||||
|
* elf32-i386.c (elf_i386_relocate_section): Use it.
|
||||||
|
* elf64-x86-64.c (elf64_x86_64_relocate_section): Likewise.
|
||||||
|
|
||||||
2010-04-30 Tristan Gingold <gingold@adacore.com>
|
2010-04-30 Tristan Gingold <gingold@adacore.com>
|
||||||
|
|
||||||
* vms-lib.c (vms_read_block): New function.
|
* vms-lib.c (vms_read_block): New function.
|
||||||
|
@ -2328,6 +2328,48 @@ extern asection _bfd_elf_large_com_section;
|
|||||||
} \
|
} \
|
||||||
while (0)
|
while (0)
|
||||||
|
|
||||||
|
/* This macro is to avoid lots of duplicated code in the body of the
|
||||||
|
loop over relocations in xxx_relocate_section() in the various
|
||||||
|
elfxx-xxxx.c files.
|
||||||
|
|
||||||
|
Handle relocations against symbols from removed linkonce sections,
|
||||||
|
or sections discarded by a linker script. When doing a relocatable
|
||||||
|
link, we remove such relocations. Otherwise, we just want the
|
||||||
|
section contents zeroed and avoid any special processing. */
|
||||||
|
#define RELOC_AGAINST_DISCARDED_SECTION(info, input_bfd, input_section, \
|
||||||
|
rel, relend, howto, contents) \
|
||||||
|
{ \
|
||||||
|
if (info->relocatable \
|
||||||
|
&& (input_section->flags & SEC_DEBUGGING)) \
|
||||||
|
{ \
|
||||||
|
/* Only remove relocations in debug sections since other \
|
||||||
|
sections may require relocations. */ \
|
||||||
|
Elf_Internal_Shdr *rel_hdr; \
|
||||||
|
\
|
||||||
|
rel_hdr = &elf_section_data (input_section->output_section)->rel_hdr; \
|
||||||
|
\
|
||||||
|
/* Avoid empty output section. */ \
|
||||||
|
if (rel_hdr->sh_size > rel_hdr->sh_entsize) \
|
||||||
|
{ \
|
||||||
|
rel_hdr->sh_size -= rel_hdr->sh_entsize; \
|
||||||
|
rel_hdr = &elf_section_data (input_section)->rel_hdr; \
|
||||||
|
rel_hdr->sh_size -= rel_hdr->sh_entsize; \
|
||||||
|
\
|
||||||
|
memmove (rel, rel + 1, (relend - rel) * sizeof (*rel)); \
|
||||||
|
\
|
||||||
|
input_section->reloc_count--; \
|
||||||
|
relend--; \
|
||||||
|
rel--; \
|
||||||
|
continue; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
_bfd_clear_contents (howto, input_bfd, contents + rel->r_offset); \
|
||||||
|
rel->r_info = 0; \
|
||||||
|
rel->r_addend = 0; \
|
||||||
|
continue; \
|
||||||
|
}
|
||||||
|
|
||||||
/* Will a symbol be bound to the the definition within the shared
|
/* Will a symbol be bound to the the definition within the shared
|
||||||
library, if any. A unique symbol can never be bound locally. */
|
library, if any. A unique symbol can never be bound locally. */
|
||||||
#define SYMBOLIC_BIND(INFO, H) \
|
#define SYMBOLIC_BIND(INFO, H) \
|
||||||
|
@ -2955,15 +2955,8 @@ elf_i386_relocate_section (bfd *output_bfd,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (sec != NULL && elf_discarded_section (sec))
|
if (sec != NULL && elf_discarded_section (sec))
|
||||||
{
|
RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
|
||||||
/* For relocs against symbols from removed linkonce sections,
|
rel, relend, howto, contents);
|
||||||
or sections discarded by a linker script, we just want the
|
|
||||||
section contents zeroed. Avoid any special processing. */
|
|
||||||
_bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
|
|
||||||
rel->r_info = 0;
|
|
||||||
rel->r_addend = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->relocatable)
|
if (info->relocatable)
|
||||||
continue;
|
continue;
|
||||||
|
@ -2685,15 +2685,8 @@ elf64_x86_64_relocate_section (bfd *output_bfd, struct bfd_link_info *info,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (sec != NULL && elf_discarded_section (sec))
|
if (sec != NULL && elf_discarded_section (sec))
|
||||||
{
|
RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
|
||||||
/* For relocs against symbols from removed linkonce sections,
|
rel, relend, howto, contents);
|
||||||
or sections discarded by a linker script, we just want the
|
|
||||||
section contents zeroed. Avoid any special processing. */
|
|
||||||
_bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
|
|
||||||
rel->r_info = 0;
|
|
||||||
rel->r_addend = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->relocatable)
|
if (info->relocatable)
|
||||||
continue;
|
continue;
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
2010-04-30 H.J. Lu <hongjiu.lu@intel.com>
|
||||||
|
|
||||||
|
PR ld/11542
|
||||||
|
* ld-elf/discard.ld: New.
|
||||||
|
* ld-elf/discard1.d: Likewise.
|
||||||
|
* ld-elf/discard1.s: Likewise.
|
||||||
|
* ld-elf/discard2.d: Likewise.
|
||||||
|
* ld-elf/discard2.s: Likewise.
|
||||||
|
* ld-elf/discard3.d: Likewise.
|
||||||
|
|
||||||
2010-04-22 Alan Modra <amodra@gmail.com>
|
2010-04-22 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* ld-elf/extract-symbol-1sec.d: Update lma.
|
* ld-elf/extract-symbol-1sec.d: Update lma.
|
||||||
|
3
ld/testsuite/ld-elf/discard.ld
Normal file
3
ld/testsuite/ld-elf/discard.ld
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
SECTIONS {
|
||||||
|
/DISCARD/ : { *(.discard) }
|
||||||
|
}
|
9
ld/testsuite/ld-elf/discard1.d
Normal file
9
ld/testsuite/ld-elf/discard1.d
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#source: discard1.s
|
||||||
|
#ld: -r -T discard.ld
|
||||||
|
#readelf: -r
|
||||||
|
#target: x86_64-*-linux-gnu i?86-*-linux-gnu
|
||||||
|
|
||||||
|
Relocation section '.rel.*.debug_info' at offset 0x[0-9a-z]+ contains 1 entries:
|
||||||
|
[ \t]+Offset[ \t]+Info[ \t]+Type[ \t]+Sym.*
|
||||||
|
[0-9a-f]+[ \t]+[0-9a-f]+[ \t]+R_.*[ \t]+[0-9a-f]+[ \t]+bar.*
|
||||||
|
#pass
|
11
ld/testsuite/ld-elf/discard1.s
Normal file
11
ld/testsuite/ld-elf/discard1.s
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
.globl bar
|
||||||
|
.data
|
||||||
|
bar:
|
||||||
|
.long 1
|
||||||
|
.section .discard,"aw",%progbits
|
||||||
|
.align 4
|
||||||
|
there:
|
||||||
|
.long 2
|
||||||
|
.section .debug_info,"",%progbits
|
||||||
|
.long bar
|
||||||
|
.long there
|
9
ld/testsuite/ld-elf/discard2.d
Normal file
9
ld/testsuite/ld-elf/discard2.d
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#source: discard2.s
|
||||||
|
#ld: -r -T discard.ld
|
||||||
|
#readelf: -r
|
||||||
|
#target: x86_64-*-linux-gnu i?86-*-linux-gnu
|
||||||
|
|
||||||
|
Relocation section '.rel.*.debug_info' at offset 0x[0-9a-z]+ contains 1 entries:
|
||||||
|
[ \t]+Offset[ \t]+Info[ \t]+Type[ \t]+Sym.*
|
||||||
|
[0-9a-f]+[ \t]+[0-9a-f]+[ \t]+R_.*[ \t]+[0-9a-f]+[ \t]+here.*
|
||||||
|
#pass
|
12
ld/testsuite/ld-elf/discard2.s
Normal file
12
ld/testsuite/ld-elf/discard2.s
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
.globl here
|
||||||
|
.data
|
||||||
|
here:
|
||||||
|
.long 1
|
||||||
|
.globl there
|
||||||
|
.section .discard,"aw",%progbits
|
||||||
|
.align 4
|
||||||
|
there:
|
||||||
|
.long 2
|
||||||
|
.section .debug_info,"",%progbits
|
||||||
|
.long here
|
||||||
|
.long there
|
11
ld/testsuite/ld-elf/discard3.d
Normal file
11
ld/testsuite/ld-elf/discard3.d
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#source: discard1.s
|
||||||
|
#source: discard2.s
|
||||||
|
#ld: -r -T discard.ld
|
||||||
|
#readelf: -r
|
||||||
|
#target: x86_64-*-linux-gnu i?86-*-linux-gnu
|
||||||
|
|
||||||
|
Relocation section '.rel.*.debug_info' at offset 0x[0-9a-z]+ contains 2 entries:
|
||||||
|
[ \t]+Offset[ \t]+Info[ \t]+Type[ \t]+Sym.*
|
||||||
|
[0-9a-f]+[ \t]+[0-9a-f]+[ \t]+R_.*[ \t]+[0-9a-f]+[ \t]+bar.*
|
||||||
|
[0-9a-f]+[ \t]+[0-9a-f]+[ \t]+R_.*[ \t]+[0-9a-f]+[ \t]+here.*
|
||||||
|
#pass
|
Reference in New Issue
Block a user