This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Fix arm-symbianelf data segment relocs
- From: Daniel Jacobowitz <drow at false dot org>
- To: binutils at sourceware dot org
- Date: Mon, 28 Apr 2008 16:38:56 -0400
- Subject: Fix arm-symbianelf data segment relocs
This patch swaps the initialization order of text_index_section
and data_index_section. This is needed because
_bfd_elf_link_omit_section_dynsym checks text_index_section; once
text_index_section is set and data_index_section is still NULL, it
will request we omit dynsyms for all sections besides
text_index_section. So we have never set data_index_section.
This patch allows arm-none-symbianelf-ld to generate R_ARM_RELATIVE
relocations against .data. I tried to enable the ELF-specific tests
in the ld testsuite for symbianelf and add one for this, but failed -
the results are very atypical because output files are not D_PAGED.
I did add one test for this specific problem. But that required
patching objdump; .rel.dyn on this target is not SEC_LOAD. I
think this change is safe but I'd appreciate review.
Tested on arm-none-symbianelf where it brings GDB test results
back from the grave. OK to commit?
--
Daniel Jacobowitz
CodeSourcery
2008-04-28 Daniel Jacobowitz <dan@codesourcery.com>
* elf.c (_bfd_elf_get_dynamic_reloc_upper_bound)
(_bfd_elf_canonicalize_dynamic_reloc): Find dynamic relocations
even if they are not loaded.
* elflink.c (_bfd_elf_init_2_index_sections): Set data_index_section
first.
2008-04-28 Daniel Jacobowitz <dan@codesourcery.com>
* ld-arm/symbian-seg1.s, ld-arm/symbian-seg1.d: New files.
* ld-arm/arm-elf.exp: Run symbian-seg1.
Index: ld/testsuite/ld-arm/symbian-seg1.d
===================================================================
--- ld/testsuite/ld-arm/symbian-seg1.d (revision 0)
+++ ld/testsuite/ld-arm/symbian-seg1.d (revision 0)
@@ -0,0 +1,8 @@
+#source: symbian-seg1.s
+#ld: -Ttext 0x10000 -Tdata 0x400000
+#objdump: -dR
+#...
+ +10000: 00400000 .word 0x00400000
+ +10000: R_ARM_RELATIVE .data
+ +10004: 00010008 .word 0x00010008
+ +10004: R_ARM_RELATIVE .text
Index: ld/testsuite/ld-arm/symbian-seg1.s
===================================================================
--- ld/testsuite/ld-arm/symbian-seg1.s (revision 0)
+++ ld/testsuite/ld-arm/symbian-seg1.s (revision 0)
@@ -0,0 +1,13 @@
+ .text
+ .globl _start
+_start:
+ .word datavar
+ .word rodatavar
+
+ .section ".rodata", "a"
+rodatavar:
+ .word 0
+
+ .section ".data", "aw"
+datavar:
+ .word 0
Index: ld/testsuite/ld-arm/arm-elf.exp
===================================================================
--- ld/testsuite/ld-arm/arm-elf.exp (revision 206063)
+++ ld/testsuite/ld-arm/arm-elf.exp (working copy)
@@ -47,6 +47,10 @@ if {[istarget "arm-*-vxworks"]} {
run_dump_test "emit-relocs1-vxworks"
}
+if { [istarget "arm*-*-symbianelf*"] } {
+ run_dump_test "symbian-seg1"
+}
+
# Exclude non-ARM-ELF targets.
if { ![is_elf_format] || ![istarget "arm*-*-*"] } {
Index: bfd/elf.c
===================================================================
--- bfd/elf.c (revision 206063)
+++ bfd/elf.c (working copy)
@@ -6577,8 +6577,7 @@ _bfd_elf_get_dynamic_reloc_upper_bound (
ret = sizeof (arelent *);
for (s = abfd->sections; s != NULL; s = s->next)
- if ((s->flags & SEC_LOAD) != 0
- && elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
+ if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
&& (elf_section_data (s)->this_hdr.sh_type == SHT_REL
|| elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
ret += ((s->size / elf_section_data (s)->this_hdr.sh_entsize)
@@ -6614,8 +6613,7 @@ _bfd_elf_canonicalize_dynamic_reloc (bfd
ret = 0;
for (s = abfd->sections; s != NULL; s = s->next)
{
- if ((s->flags & SEC_LOAD) != 0
- && elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
+ if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
&& (elf_section_data (s)->this_hdr.sh_type == SHT_REL
|| elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
{
Index: bfd/elflink.c
===================================================================
--- bfd/elflink.c (revision 206063)
+++ bfd/elflink.c (working copy)
@@ -6136,20 +6136,22 @@ _bfd_elf_init_2_index_sections (bfd *out
{
asection *s;
+ /* Data first, since setting text_index_section changes
+ _bfd_elf_link_omit_section_dynsym. */
for (s = output_bfd->sections; s != NULL; s = s->next)
- if (((s->flags & (SEC_EXCLUDE | SEC_ALLOC | SEC_READONLY))
- == (SEC_ALLOC | SEC_READONLY))
+ if (((s->flags & (SEC_EXCLUDE | SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
&& !_bfd_elf_link_omit_section_dynsym (output_bfd, info, s))
{
- elf_hash_table (info)->text_index_section = s;
+ elf_hash_table (info)->data_index_section = s;
break;
}
for (s = output_bfd->sections; s != NULL; s = s->next)
- if (((s->flags & (SEC_EXCLUDE | SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
+ if (((s->flags & (SEC_EXCLUDE | SEC_ALLOC | SEC_READONLY))
+ == (SEC_ALLOC | SEC_READONLY))
&& !_bfd_elf_link_omit_section_dynsym (output_bfd, info, s))
{
- elf_hash_table (info)->data_index_section = s;
+ elf_hash_table (info)->text_index_section = s;
break;
}