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.
This commit is contained in:
Alan Modra 2016-05-13 11:48:56 +09:30
parent c8e44c6d16
commit 4ade44b727
34 changed files with 200 additions and 186 deletions

View File

@ -1,3 +1,39 @@
2016-05-13 Alan Modra <amodra@gmail.com>
* 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.
2016-05-13 Alan Modra <amodra@gmail.com> 2016-05-13 Alan Modra <amodra@gmail.com>
* elflink.c (elf_link_sort_relocs): Wrap overlong lines. Fix * elflink.c (elf_link_sort_relocs): Wrap overlong lines. Fix

View File

@ -5462,15 +5462,13 @@ _bfd_mn10300_elf_finish_dynamic_sections (bfd * output_bfd,
case DT_JMPREL: case DT_JMPREL:
name = ".rela.plt"; name = ".rela.plt";
get_vma: get_vma:
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
@ -5485,7 +5483,7 @@ _bfd_mn10300_elf_finish_dynamic_sections (bfd * output_bfd,
the linker script arranges for .rela.plt to follow all the linker script arranges for .rela.plt to follow all
other relocation sections, we don't have to worry other relocation sections, we don't have to worry
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
if (s != NULL) if (s != NULL)
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);

View File

@ -2395,19 +2395,13 @@ GOT_OFFSET = 0x%x, GOT_VMA = 0x%x, INDEX = %d, ADDEND = 0x%x\n",
return TRUE; return TRUE;
} }
#define GET_SYMBOL_OR_SECTION(TAG, SYMBOL, SECTION, ASSERT) \ #define GET_SYMBOL_OR_SECTION(TAG, SYMBOL, SECTION) \
case TAG: \ case TAG: \
if (SYMBOL != NULL) \ if (SYMBOL != NULL) \
{ \ h = elf_link_hash_lookup (elf_hash_table (info), \
h = elf_link_hash_lookup (elf_hash_table (info), \ SYMBOL, FALSE, FALSE, TRUE); \
SYMBOL, FALSE, FALSE, TRUE); \
} \
else if (SECTION != NULL) \ else if (SECTION != NULL) \
{ \ s = bfd_get_linker_section (dynobj, SECTION); \
s = bfd_get_section_by_name (output_bfd, SECTION); \
BFD_ASSERT (s != NULL || !ASSERT); \
do_it = TRUE; \
} \
break; break;
/* Function : elf_arc_finish_dynamic_sections /* Function : elf_arc_finish_dynamic_sections
@ -2445,15 +2439,15 @@ elf_arc_finish_dynamic_sections (bfd * output_bfd,
switch (internal_dyn.d_tag) switch (internal_dyn.d_tag)
{ {
GET_SYMBOL_OR_SECTION (DT_INIT, "_init", NULL, TRUE) GET_SYMBOL_OR_SECTION (DT_INIT, "_init", NULL)
GET_SYMBOL_OR_SECTION (DT_FINI, "_fini", NULL, TRUE) GET_SYMBOL_OR_SECTION (DT_FINI, "_fini", NULL)
GET_SYMBOL_OR_SECTION (DT_PLTGOT, NULL, ".plt", TRUE) GET_SYMBOL_OR_SECTION (DT_PLTGOT, NULL, ".plt")
GET_SYMBOL_OR_SECTION (DT_JMPREL, NULL, ".rela.plt", TRUE) GET_SYMBOL_OR_SECTION (DT_JMPREL, NULL, ".rela.plt")
GET_SYMBOL_OR_SECTION (DT_PLTRELSZ, NULL, ".rela.plt", TRUE) GET_SYMBOL_OR_SECTION (DT_PLTRELSZ, NULL, ".rela.plt")
GET_SYMBOL_OR_SECTION (DT_RELASZ, NULL, ".rela.plt", FALSE) GET_SYMBOL_OR_SECTION (DT_RELASZ, NULL, ".rela.plt")
GET_SYMBOL_OR_SECTION (DT_VERSYM, NULL, ".gnu.version", TRUE) GET_SYMBOL_OR_SECTION (DT_VERSYM, NULL, ".gnu.version")
GET_SYMBOL_OR_SECTION (DT_VERDEF, NULL, ".gnu.version_d", TRUE) GET_SYMBOL_OR_SECTION (DT_VERDEF, NULL, ".gnu.version_d")
GET_SYMBOL_OR_SECTION (DT_VERNEED, NULL, ".gnu.version_r", TRUE) GET_SYMBOL_OR_SECTION (DT_VERNEED, NULL, ".gnu.version_r")
default: default:
break; break;
} }
@ -2490,7 +2484,8 @@ elf_arc_finish_dynamic_sections (bfd * output_bfd,
case DT_VERSYM: case DT_VERSYM:
case DT_VERDEF: case DT_VERDEF:
case DT_VERNEED: 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; do_it = TRUE;
break; 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); bfd_elf32_swap_dyn_out (output_bfd, &internal_dyn, dyncon);
} }

View File

@ -15281,27 +15281,26 @@ elf32_arm_finish_dynamic_sections (bfd * output_bfd, struct bfd_link_info * info
goto get_vma_if_bpabi; goto get_vma_if_bpabi;
case DT_PLTGOT: case DT_PLTGOT:
name = ".got"; name = htab->symbian_p ? ".got" : ".got.plt";
goto get_vma; goto get_vma;
case DT_JMPREL: case DT_JMPREL:
name = RELOC_SECTION (htab, ".plt"); name = RELOC_SECTION (htab, ".plt");
get_vma: get_vma:
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
if (s == NULL) if (s == NULL)
{ {
/* PR ld/14397: Issue an error message if a required section is missing. */
(*_bfd_error_handler) (*_bfd_error_handler)
(_("error: required section '%s' not found in the linker script"), name); (_("could not find section %s"), name);
bfd_set_error (bfd_error_invalid_operation); bfd_set_error (bfd_error_invalid_operation);
return FALSE; return FALSE;
} }
if (!htab->symbian_p) if (!htab->symbian_p)
dyn.d_un.d_ptr = s->vma; dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
else else
/* In the BPABI, tags in the PT_DYNAMIC section point /* In the BPABI, tags in the PT_DYNAMIC section point
at the file offset, not the memory address, for the at the file offset, not the memory address, for the
convenience of the post linker. */ convenience of the post linker. */
dyn.d_un.d_ptr = s->filepos; dyn.d_un.d_ptr = s->output_section->filepos + s->output_offset;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;

View File

@ -2743,21 +2743,19 @@ _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd,
break; break;
case DT_PLTGOT: case DT_PLTGOT:
name = ".got"; name = ".got.plt";
goto get_vma; goto get_vma;
case DT_JMPREL: case DT_JMPREL:
name = ".rela.plt"; name = ".rela.plt";
get_vma: get_vma:
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
@ -2772,7 +2770,7 @@ _bfd_cr16_elf_finish_dynamic_sections (bfd * output_bfd,
the linker script arranges for .rela.plt to follow all the linker script arranges for .rela.plt to follow all
other relocation sections, we don't have to worry other relocation sections, we don't have to worry
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
if (s != NULL) if (s != NULL)
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);

View File

@ -2336,22 +2336,21 @@ elf_cris_finish_dynamic_sections (bfd *output_bfd,
break; break;
case DT_PLTGOT: case DT_PLTGOT:
s = bfd_get_section_by_name (output_bfd, ".got"); dyn.d_un.d_ptr = sgot->output_section->vma + sgot->output_offset;
BFD_ASSERT (s != NULL);
dyn.d_un.d_ptr = s->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_JMPREL: case DT_JMPREL:
/* Yes, we *can* have a .plt and no .plt.rela, for instance /* Yes, we *can* have a .plt and no .plt.rela, for instance
if all symbols are found in the .got (not .got.plt). */ if all symbols are found in the .got (not .got.plt). */
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
dyn.d_un.d_ptr = s != NULL ? s->vma : 0; dyn.d_un.d_ptr = s != NULL ? (s->output_section->vma
+ s->output_offset) : 0;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
if (s == NULL) if (s == NULL)
dyn.d_un.d_val = 0; dyn.d_un.d_val = 0;
else else
@ -2367,7 +2366,7 @@ elf_cris_finish_dynamic_sections (bfd *output_bfd,
linker script arranges for .rela.plt to follow all linker script arranges for .rela.plt to follow all
other relocation sections, we don't have to worry other relocation sections, we don't have to worry
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
if (s != NULL) if (s != NULL)
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);

View File

@ -919,13 +919,13 @@ i370_elf_finish_dynamic_sections (bfd *output_bfd,
{ {
asection *s; asection *s;
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
if (s == NULL) if (s == NULL)
dyn.d_un.d_val = 0; dyn.d_un.d_val = 0;
else else
{ {
if (! size) if (! size)
dyn.d_un.d_ptr = s->vma; dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
else else
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
} }

View File

@ -1456,19 +1456,17 @@ lm32_elf_finish_dynamic_sections (bfd *output_bfd,
break; break;
case DT_PLTGOT: case DT_PLTGOT:
s = htab->sgot->output_section; s = htab->sgotplt;
goto get_vma; goto get_vma;
case DT_JMPREL: case DT_JMPREL:
s = htab->srelplt->output_section; s = htab->srelplt;
get_vma: get_vma:
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = htab->srelplt->output_section; s = htab->srelplt;
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
@ -1485,7 +1483,7 @@ lm32_elf_finish_dynamic_sections (bfd *output_bfd,
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
if (htab->srelplt != NULL) if (htab->srelplt != NULL)
{ {
s = htab->srelplt->output_section; s = htab->srelplt;
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
} }
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);

View File

@ -3353,19 +3353,17 @@ m32r_elf_finish_dynamic_sections (bfd *output_bfd,
break; break;
case DT_PLTGOT: case DT_PLTGOT:
s = htab->sgot->output_section; s = htab->sgotplt;
goto get_vma; goto get_vma;
case DT_JMPREL: case DT_JMPREL:
s = htab->srelplt->output_section; s = htab->srelplt;
get_vma: get_vma:
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = htab->srelplt->output_section; s = htab->srelplt;
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
@ -3382,7 +3380,7 @@ m32r_elf_finish_dynamic_sections (bfd *output_bfd,
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
if (htab->srelplt != NULL) if (htab->srelplt != NULL)
{ {
s = htab->srelplt->output_section; s = htab->srelplt;
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
} }
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);

View File

@ -4496,20 +4496,18 @@ elf_m68k_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
break; break;
case DT_PLTGOT: case DT_PLTGOT:
name = ".got"; name = ".got.plt";
goto get_vma; goto get_vma;
case DT_JMPREL: case DT_JMPREL:
name = ".rela.plt"; name = ".rela.plt";
get_vma: get_vma:
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
@ -4522,7 +4520,7 @@ elf_m68k_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
linker script arranges for .rela.plt to follow all linker script arranges for .rela.plt to follow all
other relocation sections, we don't have to worry other relocation sections, we don't have to worry
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
if (s != NULL) if (s != NULL)
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);

View File

@ -3330,16 +3330,14 @@ elf_metag_finish_dynamic_sections (bfd *output_bfd,
continue; continue;
case DT_PLTGOT: case DT_PLTGOT:
s = htab->sgot->output_section; s = htab->sgot;
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma + htab->sgot->output_offset;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_JMPREL: case DT_JMPREL:
s = htab->srelplt->output_section; s = htab->srelplt;
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;

View File

@ -3403,13 +3403,13 @@ microblaze_elf_finish_dynamic_sections (bfd *output_bfd,
{ {
asection *s; asection *s;
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
if (s == NULL) if (s == NULL)
dyn.d_un.d_val = 0; dyn.d_un.d_val = 0;
else else
{ {
if (! size) if (! size)
dyn.d_un.d_ptr = s->vma; dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
else else
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
} }

View File

@ -5710,20 +5710,17 @@ nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
break; break;
case DT_PLTGOT: case DT_PLTGOT:
/* name = ".got"; */ s = htab->sgotplt;
s = htab->sgot->output_section;
goto get_vma; goto get_vma;
case DT_JMPREL: case DT_JMPREL:
s = htab->srelplt->output_section; s = htab->srelplt;
get_vma: get_vma:
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = htab->srelplt->output_section; s = htab->srelplt;
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
@ -5740,7 +5737,7 @@ nds32_elf_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
if (htab->srelplt != NULL) if (htab->srelplt != NULL)
{ {
s = htab->srelplt->output_section; s = htab->srelplt;
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
} }
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);

View File

@ -5344,22 +5344,19 @@ nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
break; break;
case DT_PLTGOT: case DT_PLTGOT:
s = htab->root.sgot; s = htab->root.sgotplt;
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->output_section->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_JMPREL: case DT_JMPREL:
s = htab->root.srelplt; s = htab->root.srelplt;
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->output_section->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = htab->root.srelplt; s = htab->root.srelplt;
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
@ -5379,9 +5376,9 @@ nios2_elf32_finish_dynamic_sections (bfd *output_bfd,
break; break;
case DT_NIOS2_GP: case DT_NIOS2_GP:
s = htab->root.sgot; s = htab->root.sgotplt;
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr
dyn.d_un.d_ptr = s->output_section->vma + 0x7ff0; = s->output_section->vma + s->output_offset + 0x7ff0;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
} }

View File

@ -1759,20 +1759,17 @@ or1k_elf_finish_dynamic_sections (bfd *output_bfd,
continue; continue;
case DT_PLTGOT: case DT_PLTGOT:
s = htab->sgot->output_section; s = htab->sgotplt;
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
break; break;
case DT_JMPREL: case DT_JMPREL:
s = htab->srelplt->output_section; s = htab->srelplt;
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = htab->srelplt->output_section; s = htab->srelplt;
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
break; break;
@ -1788,19 +1785,8 @@ or1k_elf_finish_dynamic_sections (bfd *output_bfd,
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
if (htab->srelplt != NULL) if (htab->srelplt != NULL)
{ {
/* FIXME: this calculation sometimes produces s = htab->srelplt;
wrong result, the problem is that the dyn.d_un.d_val
is not always correct, needs investigation why
that happens. In the meantime, reading the
".rela.dyn" section by name seems to yield
correct result.
s = htab->srelplt->output_section;
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
*/
s = bfd_get_section_by_name (output_bfd, ".rela.dyn");
dyn.d_un.d_val = s ? s->size : 0;
} }
break; break;
} }

View File

@ -3953,15 +3953,17 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd,
continue; continue;
case DT_PLTGOT: case DT_PLTGOT:
dyn.d_un.d_ptr = htab->elf.sgot->output_section->vma; s = htab->elf.sgotplt;
dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
break; break;
case DT_JMPREL: case DT_JMPREL:
dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma; s = htab->elf.srelplt;
dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = htab->elf.srelplt->output_section; s = htab->elf.srelplt;
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
break; break;
} }

View File

@ -3618,21 +3618,19 @@ s3_bfd_score_elf_finish_dynamic_sections (bfd *output_bfd,
switch (dyn.d_tag) switch (dyn.d_tag)
{ {
case DT_RELENT: case DT_RELENT:
s = score_elf_rel_dyn_section (dynobj, FALSE);
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = SCORE_ELF_REL_SIZE (dynobj); dyn.d_un.d_val = SCORE_ELF_REL_SIZE (dynobj);
break; break;
case DT_STRSZ: case DT_STRSZ:
/* Rewrite DT_STRSZ. */ /* Rewrite DT_STRSZ. */
dyn.d_un.d_val = _bfd_elf_strtab_size (elf_hash_table (info)->dynstr); dyn.d_un.d_val
break; = _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
break;
case DT_PLTGOT: case DT_PLTGOT:
name = ".got"; name = ".got";
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
break; break;
case DT_SCORE_BASE_ADDRESS: case DT_SCORE_BASE_ADDRESS:
@ -3665,9 +3663,7 @@ s3_bfd_score_elf_finish_dynamic_sections (bfd *output_bfd,
case DT_SCORE_SYMTABNO: case DT_SCORE_SYMTABNO:
name = ".dynsym"; name = ".dynsym";
elemsize = SCORE_ELF_SYM_SIZE (output_bfd); elemsize = SCORE_ELF_SYM_SIZE (output_bfd);
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size / elemsize; dyn.d_un.d_val = s->size / elemsize;
break; break;

View File

@ -3429,21 +3429,19 @@ s7_bfd_score_elf_finish_dynamic_sections (bfd *output_bfd,
switch (dyn.d_tag) switch (dyn.d_tag)
{ {
case DT_RELENT: case DT_RELENT:
s = score_elf_rel_dyn_section (dynobj, FALSE);
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = SCORE_ELF_REL_SIZE (dynobj); dyn.d_un.d_val = SCORE_ELF_REL_SIZE (dynobj);
break; break;
case DT_STRSZ: case DT_STRSZ:
/* Rewrite DT_STRSZ. */ /* Rewrite DT_STRSZ. */
dyn.d_un.d_val = _bfd_elf_strtab_size (elf_hash_table (info)->dynstr); dyn.d_un.d_val
break; = _bfd_elf_strtab_size (elf_hash_table (info)->dynstr);
break;
case DT_PLTGOT: case DT_PLTGOT:
name = ".got"; name = ".got";
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
break; break;
case DT_SCORE_BASE_ADDRESS: case DT_SCORE_BASE_ADDRESS:
@ -3476,9 +3474,7 @@ s7_bfd_score_elf_finish_dynamic_sections (bfd *output_bfd,
case DT_SCORE_SYMTABNO: case DT_SCORE_SYMTABNO:
name = ".dynsym"; name = ".dynsym";
elemsize = SCORE_ELF_SYM_SIZE (output_bfd); elemsize = SCORE_ELF_SYM_SIZE (output_bfd);
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size / elemsize; dyn.d_un.d_val = s->size / elemsize;
break; break;

View File

@ -1929,20 +1929,18 @@ elf_vax_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
break; break;
case DT_PLTGOT: case DT_PLTGOT:
name = ".got"; name = ".got.plt";
goto get_vma; goto get_vma;
case DT_JMPREL: case DT_JMPREL:
name = ".rela.plt"; name = ".rela.plt";
get_vma: get_vma:
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
@ -1955,7 +1953,7 @@ elf_vax_finish_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info)
linker script arranges for .rela.plt to follow all linker script arranges for .rela.plt to follow all
other relocation sections, we don't have to worry other relocation sections, we don't have to worry
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
if (s != NULL) if (s != NULL)
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);

View File

@ -3430,19 +3430,22 @@ elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
break; break;
case DT_XTENSA_GOT_LOC_OFF: case DT_XTENSA_GOT_LOC_OFF:
dyn.d_un.d_ptr = htab->sgotloc->output_section->vma; dyn.d_un.d_ptr = (htab->sgotloc->output_section->vma
+ htab->sgotloc->output_offset);
break; break;
case DT_PLTGOT: case DT_PLTGOT:
dyn.d_un.d_ptr = htab->sgot->output_section->vma; dyn.d_un.d_ptr = (htab->sgot->output_section->vma
+ htab->sgot->output_offset);
break; break;
case DT_JMPREL: case DT_JMPREL:
dyn.d_un.d_ptr = htab->srelplt->output_section->vma; dyn.d_un.d_ptr = (htab->srelplt->output_section->vma
+ htab->srelplt->output_offset);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
dyn.d_un.d_val = htab->srelplt->output_section->size; dyn.d_un.d_val = htab->srelplt->size;
break; break;
case DT_RELASZ: case DT_RELASZ:
@ -3453,7 +3456,7 @@ elf_xtensa_finish_dynamic_sections (bfd *output_bfd,
for .rela.plt to follow all other relocation sections, we for .rela.plt to follow all other relocation sections, we
don't have to worry about changing the DT_RELA entry. */ don't have to worry about changing the DT_RELA entry. */
if (htab->srelplt) if (htab->srelplt)
dyn.d_un.d_val -= htab->srelplt->output_section->size; dyn.d_un.d_val -= htab->srelplt->size;
break; break;
} }

View File

@ -5011,7 +5011,7 @@ elf64_alpha_finish_dynamic_sections (bfd *output_bfd,
bfd_vma plt_vma, gotplt_vma; bfd_vma plt_vma, gotplt_vma;
splt = bfd_get_linker_section (dynobj, ".plt"); splt = bfd_get_linker_section (dynobj, ".plt");
srelaplt = bfd_get_linker_section (output_bfd, ".rela.plt"); srelaplt = bfd_get_linker_section (dynobj, ".rela.plt");
BFD_ASSERT (splt != NULL && sdyn != NULL); BFD_ASSERT (splt != NULL && sdyn != NULL);
plt_vma = splt->output_section->vma + splt->output_offset; plt_vma = splt->output_section->vma + splt->output_offset;
@ -5043,7 +5043,8 @@ elf64_alpha_finish_dynamic_sections (bfd *output_bfd,
dyn.d_un.d_val = srelaplt ? srelaplt->size : 0; dyn.d_un.d_val = srelaplt ? srelaplt->size : 0;
break; break;
case DT_JMPREL: case DT_JMPREL:
dyn.d_un.d_ptr = srelaplt ? srelaplt->vma : 0; dyn.d_un.d_ptr = srelaplt ? (srelaplt->output_section->vma
+ srelaplt->output_offset) : 0;
break; break;
case DT_RELASZ: case DT_RELASZ:

View File

@ -3749,15 +3749,17 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd,
continue; continue;
case DT_PLTGOT: case DT_PLTGOT:
dyn.d_un.d_ptr = htab->elf.sgot->output_section->vma; s = htab->elf.sgotplt;
dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
break; break;
case DT_JMPREL: case DT_JMPREL:
dyn.d_un.d_ptr = htab->elf.srelplt->output_section->vma; s = htab->elf.srelplt;
dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = htab->elf.srelplt->output_section; s = htab->elf.srelplt;
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
break; break;
@ -3769,7 +3771,7 @@ elf_s390_finish_dynamic_sections (bfd *output_bfd,
linker script arranges for .rela.plt to follow all linker script arranges for .rela.plt to follow all
other relocation sections, we don't have to worry other relocation sections, we don't have to worry
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
s = htab->elf.srelplt->output_section; s = htab->elf.srelplt;
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
break; break;
} }

View File

@ -3817,21 +3817,19 @@ sh64_elf64_finish_dynamic_sections (bfd *output_bfd,
break; break;
case DT_PLTGOT: case DT_PLTGOT:
name = ".got"; name = ".got.plt";
goto get_vma; goto get_vma;
case DT_JMPREL: case DT_JMPREL:
name = ".rela.plt"; name = ".rela.plt";
get_vma: get_vma:
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
BFD_ASSERT (s != NULL); dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
dyn.d_un.d_ptr = s->vma;
bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
BFD_ASSERT (s != NULL);
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
break; break;
@ -3846,7 +3844,7 @@ sh64_elf64_finish_dynamic_sections (bfd *output_bfd,
the linker script arranges for .rela.plt to follow all the linker script arranges for .rela.plt to follow all
other relocation sections, we don't have to worry other relocation sections, we don't have to worry
about changing the DT_RELA entry. */ about changing the DT_RELA entry. */
s = bfd_get_section_by_name (output_bfd, ".rela.plt"); s = bfd_get_linker_section (dynobj, ".rela.plt");
if (s != NULL) if (s != NULL)
dyn.d_un.d_val -= s->size; dyn.d_un.d_val -= s->size;
bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);

View File

@ -11895,18 +11895,18 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
case DT_PREINIT_ARRAYSZ: case DT_PREINIT_ARRAYSZ:
name = ".preinit_array"; name = ".preinit_array";
goto get_size; goto get_out_size;
case DT_INIT_ARRAYSZ: case DT_INIT_ARRAYSZ:
name = ".init_array"; name = ".init_array";
goto get_size; goto get_out_size;
case DT_FINI_ARRAYSZ: case DT_FINI_ARRAYSZ:
name = ".fini_array"; name = ".fini_array";
get_size: get_out_size:
o = bfd_get_section_by_name (abfd, name); o = bfd_get_section_by_name (abfd, name);
if (o == NULL) if (o == NULL)
{ {
(*_bfd_error_handler) (*_bfd_error_handler)
(_("%B: could not find output section %s"), abfd, name); (_("could not find section %s"), name);
goto error_return; goto error_return;
} }
if (o->size == 0) if (o->size == 0)
@ -11917,13 +11917,15 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
case DT_PREINIT_ARRAY: case DT_PREINIT_ARRAY:
name = ".preinit_array"; name = ".preinit_array";
goto get_vma; goto get_out_vma;
case DT_INIT_ARRAY: case DT_INIT_ARRAY:
name = ".init_array"; name = ".init_array";
goto get_vma; goto get_out_vma;
case DT_FINI_ARRAY: case DT_FINI_ARRAY:
name = ".fini_array"; name = ".fini_array";
goto get_vma; get_out_vma:
o = bfd_get_section_by_name (abfd, name);
goto do_vma;
case DT_HASH: case DT_HASH:
name = ".hash"; name = ".hash";
@ -11946,11 +11948,12 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
case DT_VERSYM: case DT_VERSYM:
name = ".gnu.version"; name = ".gnu.version";
get_vma: get_vma:
o = bfd_get_section_by_name (abfd, name); o = bfd_get_linker_section (dynobj, name);
do_vma:
if (o == NULL) if (o == NULL)
{ {
(*_bfd_error_handler) (*_bfd_error_handler)
(_("%B: could not find output section %s"), abfd, name); (_("could not find section %s"), name);
goto error_return; goto error_return;
} }
if (elf_section_data (o->output_section)->this_hdr.sh_type == SHT_NOTE) if (elf_section_data (o->output_section)->this_hdr.sh_type == SHT_NOTE)
@ -11960,7 +11963,7 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
bfd_set_error (bfd_error_nonrepresentable_section); bfd_set_error (bfd_error_nonrepresentable_section);
goto error_return; goto error_return;
} }
dyn.d_un.d_ptr = o->vma; dyn.d_un.d_ptr = o->output_section->vma + o->output_offset;
break; break;
case DT_REL: case DT_REL:

View File

@ -9053,7 +9053,8 @@ elfNN_aarch64_finish_dynamic_sections (bfd *output_bfd,
break; break;
case DT_JMPREL: case DT_JMPREL:
dyn.d_un.d_ptr = htab->root.srelplt->output_section->vma; s = htab->root.srelplt;
dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
break; break;
case DT_PLTRELSZ: case DT_PLTRELSZ:

View File

@ -11466,7 +11466,7 @@ _bfd_mips_elf_finish_dynamic_sections (bfd *output_bfd,
case DT_MIPS_SYMTABNO: case DT_MIPS_SYMTABNO:
name = ".dynsym"; name = ".dynsym";
elemsize = MIPS_ELF_SYM_SIZE (output_bfd); elemsize = MIPS_ELF_SYM_SIZE (output_bfd);
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
if (s != NULL) if (s != NULL)
dyn.d_un.d_val = s->size / elemsize; dyn.d_un.d_val = s->size / elemsize;

View File

@ -4630,13 +4630,13 @@ sparc_finish_dyn (bfd *output_bfd, struct bfd_link_info *info,
{ {
asection *s; asection *s;
s = bfd_get_section_by_name (output_bfd, name); s = bfd_get_linker_section (dynobj, name);
if (s == NULL) if (s == NULL)
dyn.d_un.d_val = 0; dyn.d_un.d_val = 0;
else else
{ {
if (! size) if (! size)
dyn.d_un.d_ptr = s->vma; dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
else else
dyn.d_un.d_val = s->size; dyn.d_un.d_val = s->size;
} }

View File

@ -1,3 +1,13 @@
2016-05-13 Alan Modra <amodra@gmail.com>
* 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.
2016-05-12 H.J. Lu <hongjiu.lu@intel.com> 2016-05-12 H.J. Lu <hongjiu.lu@intel.com>
PR ld/20070 PR ld/20070

View File

@ -286,11 +286,11 @@ set armelftests_nonacl {
{"Simple static application without .rel.plt in linker script" {"Simple static application without .rel.plt in linker script"
"-T arm-no-rel-plt.ld" "" "" {arm-static-app.s} "-T arm-no-rel-plt.ld" "" "" {arm-static-app.s}
{{objdump -fdw arm-static-app.d} {objdump -rw arm-static-app.r}} {{objdump -fdw arm-static-app.d} {objdump -rw arm-static-app.r}}
"arm-static-app"} "arm-static-app-no-rel-plt"}
{"Simple dynamic application without .rel.plt in linker script" {"Simple dynamic application without .rel.plt in linker script"
"tmpdir/arm-lib.so -T arm-no-rel-plt.ld" "" "" {arm-app.s} "tmpdir/arm-lib.so -T arm-no-rel-plt.ld" "" "" {arm-app.s}
{{ld arm-no-rel-plt.out}} {{readelf -dr arm-no-rel-plt.r}}
"arm-app"} "arm-app-no-rel-plt"}
{"Non-pcrel function reference" "tmpdir/arm-lib.so" "" "" {arm-app-abs32.s} {"Non-pcrel function reference" "tmpdir/arm-lib.so" "" "" {arm-app-abs32.s}
{{objdump -fdw arm-app-abs32.d} {objdump -Rw arm-app-abs32.r}} {{objdump -fdw arm-app-abs32.d} {objdump -Rw arm-app-abs32.r}}
"arm-app-abs32"} "arm-app-abs32"}

View File

@ -14,7 +14,7 @@ SECTIONS
.gnu.version : { *(.gnu.version) } .gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) } .gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) } .gnu.version_r : { *(.gnu.version_r) }
.rel.dyn : .rel.dyn ALIGN (0x100) :
{ {
*(.rel.init) *(.rel.init)
*(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*)
@ -34,7 +34,7 @@ SECTIONS
PROVIDE_HIDDEN (__rela_iplt_start = .); PROVIDE_HIDDEN (__rela_iplt_start = .);
PROVIDE_HIDDEN (__rela_iplt_end = .); PROVIDE_HIDDEN (__rela_iplt_end = .);
} }
.rela.dyn : .rela.dyn ALIGN (0x100) :
{ {
*(.rela.init) *(.rela.init)
*(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*)

View File

@ -1,2 +0,0 @@
.*: error: required section '.rel.plt' not found in the linker script
.*: final link failed: Invalid operation

View File

@ -0,0 +1,9 @@
#...
0x00000017 \(JMPREL\) +0x.*08
0x00000011 \(REL\) +0x.*00
#...
Relocation section '\.rel\.dyn' at offset 0x.*00 contains 2 entries:
Offset +Info +Type +Sym\.Value +Sym\. Name
.* R_ARM_COPY .* data_obj
.* R_ARM_JUMP_SLOT .* lib_func1

View File

@ -1,5 +1,5 @@
tmpdir/arm-static-app: file format elf32-(little|big)arm.* .*: file format elf32-(little|big)arm.*
architecture: arm.*, flags 0x00000112: architecture: arm.*, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED EXEC_P, HAS_SYMS, D_PAGED
start address 0x.* start address 0x.*

View File

@ -1,3 +1,3 @@
tmpdir/arm-static-app: file format elf32-(little|big)arm.* .*: file format elf32-(little|big)arm.*