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:
H.J. Lu 2010-04-30 18:27:32 +00:00
parent 705b5767b7
commit 0672748ac0
11 changed files with 119 additions and 18 deletions

View File

@ -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.

View File

@ -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) \

View File

@ -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;

View File

@ -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;

View File

@ -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.

View File

@ -0,0 +1,3 @@
SECTIONS {
/DISCARD/ : { *(.discard) }
}

View 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

View 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

View 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

View 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

View 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