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:
parent
705b5767b7
commit
0672748ac0
@ -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>
|
||||
|
||||
* vms-lib.c (vms_read_block): New function.
|
||||
|
@ -2328,6 +2328,48 @@ extern asection _bfd_elf_large_com_section;
|
||||
} \
|
||||
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
|
||||
library, if any. A unique symbol can never be bound locally. */
|
||||
#define SYMBOLIC_BIND(INFO, H) \
|
||||
|
@ -2955,15 +2955,8 @@ elf_i386_relocate_section (bfd *output_bfd,
|
||||
}
|
||||
|
||||
if (sec != NULL && elf_discarded_section (sec))
|
||||
{
|
||||
/* For relocs against symbols from removed linkonce sections,
|
||||
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;
|
||||
}
|
||||
RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
|
||||
rel, relend, howto, contents);
|
||||
|
||||
if (info->relocatable)
|
||||
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))
|
||||
{
|
||||
/* For relocs against symbols from removed linkonce sections,
|
||||
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;
|
||||
}
|
||||
RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
|
||||
rel, relend, howto, contents);
|
||||
|
||||
if (info->relocatable)
|
||||
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>
|
||||
|
||||
* 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
|
Loading…
Reference in New Issue
Block a user