diff options
author | Alan Modra <amodra@gmail.com> | 2016-05-13 11:48:56 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2016-05-13 14:34:45 +0930 |
commit | 4ade44b727ee77adaa9c22719935d012e253a5e6 (patch) | |
tree | b8245860459f263489810f5ad2a3a0dc1bc1c5df /bfd/elf32-arc.c | |
parent | c8e44c6d168f8e68b7bbb1119065e0059a16fe34 (diff) | |
download | gdb-4ade44b727ee77adaa9c22719935d012e253a5e6.zip gdb-4ade44b727ee77adaa9c22719935d012e253a5e6.tar.gz gdb-4ade44b727ee77adaa9c22719935d012e253a5e6.tar.bz2 |
Set dynamic tag VMA and size from dynamic section when possible
Rather than searching the output for a specific named section, it's
better, where possible, to use a linker created dynamic section to set
a dynamic tag's value. That way ld doesn't depend on the output
section name, making it possibile to map dynamic sections differently.
bfd/
* elf-m10300.c (_bfd_mn10300_elf_finish_dynamic_sections): Use
linker dynamic sections in calculating size and address of
* dynamic tags rather than using output sections. Remove asserts.
* elf32-arm.c (elf32_arm_finish_dynamic_sections): Likewise.
* elf32-cr16.c (_bfd_cr16_elf_finish_dynamic_sections): Likewise.
* elf32-cris.c (elf_cris_finish_dynamic_sections): Likewise.
* elf32-i370.c (i370_elf_finish_dynamic_sections): Likewise.
* elf32-lm32.c (lm32_elf_finish_dynamic_sections): Likewise.
* elf32-m32r.c (m32r_elf_finish_dynamic_sections): Likewise.
* elf32-m68k.c (elf_m68k_finish_dynamic_sections): Likewise.
* elf32-metag.c (elf_metag_finish_dynamic_sections): Likewise.
* elf32-microblaze.c (microblaze_elf_finish_dynamic_sections): Likewise.
* elf32-nds32.c (nds32_elf_finish_dynamic_sections): Likewise.
* elf32-nios2.c (nios2_elf32_finish_dynamic_sections): Likewise.
* elf32-or1k.c (or1k_elf_finish_dynamic_sections): Likewise.
* elf32-s390.c (elf_s390_finish_dynamic_sections): Likewise.
* elf32-score.c (s3_bfd_score_elf_finish_dynamic_sections): Likewise.
* elf32-score7.c (s7_bfd_score_elf_finish_dynamic_sections): Likewise.
* elf32-vax.c (elf_vax_finish_dynamic_sections): Likewise.
* elf32-xtensa.c (elf_xtensa_finish_dynamic_sections): Likewise.
* elf64-alpha.c (elf64_alpha_finish_dynamic_sections): Likewise.
* elf64-s390.c (elf_s390_finish_dynamic_sections): Likewise.
* elf64-sh64.c (sh64_elf64_finish_dynamic_sections): Likewise.
* elflink.c (bfd_elf_final_link): Likewise.
* elfxx-mips.c (_bfd_mips_elf_finish_dynamic_sections): Likewise.
* elfxx-sparc.c (sparc_finish_dyn): Likewise. Adjust error message.
* elf32-arc.c (GET_SYMBOL_OR_SECTION): Remove ASSERT arg and
don't set doit. Look up dynobj section.
(elf_arc_finish_dynamic_sections): Adjust GET_SYMBOL_OR_SECTION
invocation and dynamic tag vma calculation. Don't test
boolean var == TRUE.
* elfnn-aarch64.c (elfNN_aarch64_finish_dynamic_sections): Fix
DT_JMPREL calc.
ld/
* testsuite/ld-arm/arm-elf.exp: Adjust for arm-no-rel-plt now passing.
Use different output file name for static app without .rel.plt.
* testsuite/ld-arm/arm-no-rel-plt.ld: Align .rel.dyn and .rela.dyn.
* testsuite/ld-arm/arm-no-rel-plt.out: Delete.
* testsuite/ld-arm/arm-no-rel-plt.r: New.
* testsuite/ld-arm/arm-static-app.d: Don't check file name.
* testsuite/ld-arm/arm-static-app.r: Likewise.
Diffstat (limited to 'bfd/elf32-arc.c')
-rw-r--r-- | bfd/elf32-arc.c | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/bfd/elf32-arc.c b/bfd/elf32-arc.c index 2df91b1..f7b0fff 100644 --- a/bfd/elf32-arc.c +++ b/bfd/elf32-arc.c @@ -2395,19 +2395,13 @@ GOT_OFFSET = 0x%x, GOT_VMA = 0x%x, INDEX = %d, ADDEND = 0x%x\n", return TRUE; } -#define GET_SYMBOL_OR_SECTION(TAG, SYMBOL, SECTION, ASSERT) \ +#define GET_SYMBOL_OR_SECTION(TAG, SYMBOL, SECTION) \ case TAG: \ if (SYMBOL != NULL) \ - { \ - h = elf_link_hash_lookup (elf_hash_table (info), \ - SYMBOL, FALSE, FALSE, TRUE); \ - } \ + h = elf_link_hash_lookup (elf_hash_table (info), \ + SYMBOL, FALSE, FALSE, TRUE); \ else if (SECTION != NULL) \ - { \ - s = bfd_get_section_by_name (output_bfd, SECTION); \ - BFD_ASSERT (s != NULL || !ASSERT); \ - do_it = TRUE; \ - } \ + s = bfd_get_linker_section (dynobj, SECTION); \ break; /* Function : elf_arc_finish_dynamic_sections @@ -2445,15 +2439,15 @@ elf_arc_finish_dynamic_sections (bfd * output_bfd, switch (internal_dyn.d_tag) { - GET_SYMBOL_OR_SECTION (DT_INIT, "_init", NULL, TRUE) - GET_SYMBOL_OR_SECTION (DT_FINI, "_fini", NULL, TRUE) - GET_SYMBOL_OR_SECTION (DT_PLTGOT, NULL, ".plt", TRUE) - GET_SYMBOL_OR_SECTION (DT_JMPREL, NULL, ".rela.plt", TRUE) - GET_SYMBOL_OR_SECTION (DT_PLTRELSZ, NULL, ".rela.plt", TRUE) - GET_SYMBOL_OR_SECTION (DT_RELASZ, NULL, ".rela.plt", FALSE) - GET_SYMBOL_OR_SECTION (DT_VERSYM, NULL, ".gnu.version", TRUE) - GET_SYMBOL_OR_SECTION (DT_VERDEF, NULL, ".gnu.version_d", TRUE) - GET_SYMBOL_OR_SECTION (DT_VERNEED, NULL, ".gnu.version_r", TRUE) + GET_SYMBOL_OR_SECTION (DT_INIT, "_init", NULL) + GET_SYMBOL_OR_SECTION (DT_FINI, "_fini", NULL) + GET_SYMBOL_OR_SECTION (DT_PLTGOT, NULL, ".plt") + GET_SYMBOL_OR_SECTION (DT_JMPREL, NULL, ".rela.plt") + GET_SYMBOL_OR_SECTION (DT_PLTRELSZ, NULL, ".rela.plt") + GET_SYMBOL_OR_SECTION (DT_RELASZ, NULL, ".rela.plt") + GET_SYMBOL_OR_SECTION (DT_VERSYM, NULL, ".gnu.version") + GET_SYMBOL_OR_SECTION (DT_VERDEF, NULL, ".gnu.version_d") + GET_SYMBOL_OR_SECTION (DT_VERNEED, NULL, ".gnu.version_r") default: break; } @@ -2490,7 +2484,8 @@ elf_arc_finish_dynamic_sections (bfd * output_bfd, case DT_VERSYM: case DT_VERDEF: case DT_VERNEED: - internal_dyn.d_un.d_ptr = s->vma; + internal_dyn.d_un.d_ptr = (s->output_section->vma + + s->output_offset); do_it = TRUE; break; @@ -2510,7 +2505,7 @@ elf_arc_finish_dynamic_sections (bfd * output_bfd, } } - if (do_it == TRUE) + if (do_it) bfd_elf32_swap_dyn_out (output_bfd, &internal_dyn, dyncon); } |