diff options
author | Rich Felker <dalias@libc.org> | 2015-09-20 12:20:19 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2015-09-20 15:52:27 +0930 |
commit | 9b8b325a1f4cdaf235e7d803849dde6ededec865 (patch) | |
tree | f9705d4b1b4e10dbb5a5453e944a31f798457088 | |
parent | 25f004c8dd2d96f92ea8f18217a04212f907eb94 (diff) | |
download | fsf-binutils-gdb-9b8b325a1f4cdaf235e7d803849dde6ededec865.zip fsf-binutils-gdb-9b8b325a1f4cdaf235e7d803849dde6ededec865.tar.gz fsf-binutils-gdb-9b8b325a1f4cdaf235e7d803849dde6ededec865.tar.bz2 |
Add --no-dynamic-linker option to ld, for static PIE use
Inhibits output of .interp section in ELF executables.
include/
* bfdlink.h (struct bfd_link_info): Add "nointerp" field.
bfd/
* elflink.c (_bfd_elf_link_create_dynamic_sections): Don't create
.interp when info->nointerp.
(bfd_elf_size_dynamic_sections): Adjust assert.
* elf32-arm.c (elf32_arm_size_dynamic_sections): Don't size .interp
when info->nointerp.
* elf32-bfin.c (elf32_bfinfdpic_size_dynamic_sections): Likewise.
* elf32-cr16.c (_bfd_cr16_elf_size_dynamic_sections): Likewise.
* elf32-cris.c (elf_cris_size_dynamic_sections): Likewise.
* elf32-frv.c (elf32_frvfdpic_size_dynamic_sections): Likewise.
* elf32-hppa.c (elf32_hppa_size_dynamic_sections): Likewise.
* elf32-i370.c (i370_elf_size_dynamic_sections): Likewise.
* elf32-i386.c (elf_i386_size_dynamic_sections): Likewise.
* elf32-lm32.c (lm32_elf_size_dynamic_sections): Likewise.
* elf32-m32r.c (m32r_elf_size_dynamic_sections): Likewise.
* elf32-m68k.c (elf_m68k_size_dynamic_sections): Likewise.
* elf32-metag.c (elf_metag_size_dynamic_sections): Likewise.
* elf32-nds32.c (nds32_elf_size_dynamic_sections): Likewise.
* elf32-nios2.c (nios2_elf32_size_dynamic_sections): Likewise.
* elf32-or1k.c (or1k_elf_size_dynamic_sections): Likewise.
* elf32-ppc.c (ppc_elf_size_dynamic_sections): Likewise.
* elf32-s390.c (elf_s390_size_dynamic_sections): Likewise.
* elf32-score.c (s3_bfd_score_elf_size_dynamic_sections): Likewise.
* elf32-score7.c (s7_bfd_score_elf_size_dynamic_sections): Likewise.
* elf32-sh.c (sh_elf_size_dynamic_sections): Likewise.
* elf32-tic6x.c (elf32_tic6x_size_dynamic_sections): Likewise.
* elf32-tilepro.c (tilepro_elf_size_dynamic_sections): Likewise.
* elf32-vax.c (elf_vax_size_dynamic_sections): Likewise.
* elf32-xtensa.c (elf_xtensa_size_dynamic_sections): Likewise.
* elf64-alpha.c (elf64_alpha_size_dynamic_sections): Likewise.
* elf64-hppa.c (elf64_hppa_size_dynamic_sections): Likewise.
* elf64-ppc.c (ppc64_elf_size_dynamic_sections): Likewise.
* elf64-s390.c (elf_s390_size_dynamic_sections): Likewise.
* elf64-sh64.c (sh64_elf64_size_dynamic_sections): Likewise.
* elf64-x86-64.c (elf_x86_64_size_dynamic_sections): Likewise.
* elfnn-aarch64.c (elfNN_aarch64_size_dynamic_sections): Likewise.
* elfnn-ia64.c (elfNN_ia64_size_dynamic_sections): Likewise.
* elfxx-mips.c (_bfd_mips_elf_size_dynamic_sections): Likewise.
* elfxx-sparc.c (_bfd_sparc_elf_size_dynamic_sections): Likewise.
* elfxx-tilegx.c (tilegx_elf_size_dynamic_sections): Likewise.
ld/
* ld.texinfo (--no-dynamic-linker): Document.
* ldlex.h (enum option_values): Add OPTION_NO_DYNAMIC_LINKER.
* lexsup.c (ld_options, parse_args): Handle --no-dynamic-linker.
43 files changed, 107 insertions, 37 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 70d9952..37ba69f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,45 @@ +2015-09-20 Rich Felker <dalias@libc.org> + + * elflink.c (_bfd_elf_link_create_dynamic_sections): Don't create + .interp when info->nointerp. + (bfd_elf_size_dynamic_sections): Adjust assert. + * elf32-arm.c (elf32_arm_size_dynamic_sections): Don't size .interp + when info->nointerp. + * elf32-bfin.c (elf32_bfinfdpic_size_dynamic_sections): Likewise. + * elf32-cr16.c (_bfd_cr16_elf_size_dynamic_sections): Likewise. + * elf32-cris.c (elf_cris_size_dynamic_sections): Likewise. + * elf32-frv.c (elf32_frvfdpic_size_dynamic_sections): Likewise. + * elf32-hppa.c (elf32_hppa_size_dynamic_sections): Likewise. + * elf32-i370.c (i370_elf_size_dynamic_sections): Likewise. + * elf32-i386.c (elf_i386_size_dynamic_sections): Likewise. + * elf32-lm32.c (lm32_elf_size_dynamic_sections): Likewise. + * elf32-m32r.c (m32r_elf_size_dynamic_sections): Likewise. + * elf32-m68k.c (elf_m68k_size_dynamic_sections): Likewise. + * elf32-metag.c (elf_metag_size_dynamic_sections): Likewise. + * elf32-nds32.c (nds32_elf_size_dynamic_sections): Likewise. + * elf32-nios2.c (nios2_elf32_size_dynamic_sections): Likewise. + * elf32-or1k.c (or1k_elf_size_dynamic_sections): Likewise. + * elf32-ppc.c (ppc_elf_size_dynamic_sections): Likewise. + * elf32-s390.c (elf_s390_size_dynamic_sections): Likewise. + * elf32-score.c (s3_bfd_score_elf_size_dynamic_sections): Likewise. + * elf32-score7.c (s7_bfd_score_elf_size_dynamic_sections): Likewise. + * elf32-sh.c (sh_elf_size_dynamic_sections): Likewise. + * elf32-tic6x.c (elf32_tic6x_size_dynamic_sections): Likewise. + * elf32-tilepro.c (tilepro_elf_size_dynamic_sections): Likewise. + * elf32-vax.c (elf_vax_size_dynamic_sections): Likewise. + * elf32-xtensa.c (elf_xtensa_size_dynamic_sections): Likewise. + * elf64-alpha.c (elf64_alpha_size_dynamic_sections): Likewise. + * elf64-hppa.c (elf64_hppa_size_dynamic_sections): Likewise. + * elf64-ppc.c (ppc64_elf_size_dynamic_sections): Likewise. + * elf64-s390.c (elf_s390_size_dynamic_sections): Likewise. + * elf64-sh64.c (sh64_elf64_size_dynamic_sections): Likewise. + * elf64-x86-64.c (elf_x86_64_size_dynamic_sections): Likewise. + * elfnn-aarch64.c (elfNN_aarch64_size_dynamic_sections): Likewise. + * elfnn-ia64.c (elfNN_ia64_size_dynamic_sections): Likewise. + * elfxx-mips.c (_bfd_mips_elf_size_dynamic_sections): Likewise. + * elfxx-sparc.c (_bfd_sparc_elf_size_dynamic_sections): Likewise. + * elfxx-tilegx.c (tilegx_elf_size_dynamic_sections): Likewise. + 2015-09-18 Doug Evans <xdje42@gmail.com> * targets.c (enum bfd_flavour): Add comment. diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index b65ae39..bd41fd0 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -13786,7 +13786,7 @@ elf32_arm_size_dynamic_sections (bfd * output_bfd ATTRIBUTE_UNUSED, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-bfin.c b/bfd/elf32-bfin.c index 152134e..0d4d9cf 100644 --- a/bfd/elf32-bfin.c +++ b/bfd/elf32-bfin.c @@ -4255,7 +4255,7 @@ elf32_bfinfdpic_size_dynamic_sections (bfd *output_bfd, if (htab->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-cr16.c b/bfd/elf32-cr16.c index 5d8ffbc..497630e 100644 --- a/bfd/elf32-cr16.c +++ b/bfd/elf32-cr16.c @@ -2464,7 +2464,7 @@ _bfd_cr16_elf_size_dynamic_sections (bfd * output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { #if 0 s = bfd_get_linker_section (dynobj, ".interp"); diff --git a/bfd/elf32-cris.c b/bfd/elf32-cris.c index 3031173..5b40524 100644 --- a/bfd/elf32-cris.c +++ b/bfd/elf32-cris.c @@ -3764,7 +3764,7 @@ elf_cris_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-frv.c b/bfd/elf32-frv.c index fa12528..1dd2e8c 100644 --- a/bfd/elf32-frv.c +++ b/bfd/elf32-frv.c @@ -5442,7 +5442,7 @@ elf32_frvfdpic_size_dynamic_sections (bfd *output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 8f0f4d0..ad40914 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -2215,7 +2215,7 @@ elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->etab.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { sec = bfd_get_linker_section (dynobj, ".interp"); if (sec == NULL) diff --git a/bfd/elf32-i370.c b/bfd/elf32-i370.c index 7fba4d1..458f694 100644 --- a/bfd/elf32-i370.c +++ b/bfd/elf32-i370.c @@ -594,7 +594,7 @@ i370_elf_size_dynamic_sections (bfd *output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c index 85885f7..9390450 100644 --- a/bfd/elf32-i386.c +++ b/bfd/elf32-i386.c @@ -2876,7 +2876,7 @@ elf_i386_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) if (htab->elf.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); if (s == NULL) diff --git a/bfd/elf32-lm32.c b/bfd/elf32-lm32.c index 23f6e5e..0805e3c 100644 --- a/bfd/elf32-lm32.c +++ b/bfd/elf32-lm32.c @@ -2141,7 +2141,7 @@ lm32_elf_size_dynamic_sections (bfd *output_bfd, if (htab->root.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-m32r.c b/bfd/elf32-m32r.c index 155d079..a2e3c7c 100644 --- a/bfd/elf32-m32r.c +++ b/bfd/elf32-m32r.c @@ -2170,7 +2170,7 @@ m32r_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->root.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-m68k.c b/bfd/elf32-m68k.c index f807e03..03940fd 100644 --- a/bfd/elf32-m68k.c +++ b/bfd/elf32-m68k.c @@ -3257,7 +3257,7 @@ elf_m68k_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-metag.c b/bfd/elf32-metag.c index 0fcafc4..596cf76 100644 --- a/bfd/elf32-metag.c +++ b/bfd/elf32-metag.c @@ -2848,7 +2848,7 @@ elf_metag_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->etab.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); if (s == NULL) diff --git a/bfd/elf32-nds32.c b/bfd/elf32-nds32.c index e591100..28d4df8 100644 --- a/bfd/elf32-nds32.c +++ b/bfd/elf32-nds32.c @@ -3980,7 +3980,7 @@ nds32_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->root.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (!bfd_link_pic (info)) + if (!bfd_link_pic (info) && !info->nointerp) { s = bfd_get_section_by_name (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-nios2.c b/bfd/elf32-nios2.c index 9189726..6b29d8b 100644 --- a/bfd/elf32-nios2.c +++ b/bfd/elf32-nios2.c @@ -5849,7 +5849,7 @@ nios2_elf32_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-or1k.c b/bfd/elf32-or1k.c index d4f92b7..a1eba09 100644 --- a/bfd/elf32-or1k.c +++ b/bfd/elf32-or1k.c @@ -2447,7 +2447,7 @@ or1k_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->root.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_section_by_name (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 3f708cb..708076d 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -6191,7 +6191,7 @@ ppc_elf_size_dynamic_sections (bfd *output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (htab->elf.dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-s390.c b/bfd/elf32-s390.c index 96c1531..2143ee1 100644 --- a/bfd/elf32-s390.c +++ b/bfd/elf32-s390.c @@ -2039,7 +2039,7 @@ elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->elf.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); if (s == NULL) diff --git a/bfd/elf32-score.c b/bfd/elf32-score.c index a976a15..ce9c377 100644 --- a/bfd/elf32-score.c +++ b/bfd/elf32-score.c @@ -3269,7 +3269,7 @@ s3_bfd_score_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *i if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (!bfd_link_pic (info)) + if (!bfd_link_pic (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-score7.c b/bfd/elf32-score7.c index 1af034e..b0e75bb 100644 --- a/bfd/elf32-score7.c +++ b/bfd/elf32-score7.c @@ -3078,7 +3078,7 @@ s7_bfd_score_elf_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *i if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (!bfd_link_pic (info)) + if (!bfd_link_pic (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-sh.c b/bfd/elf32-sh.c index fdeadd0..9fa3636 100644 --- a/bfd/elf32-sh.c +++ b/bfd/elf32-sh.c @@ -3349,7 +3349,7 @@ sh_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->root.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c index b6640ea..380ab8d 100644 --- a/bfd/elf32-tic6x.c +++ b/bfd/elf32-tic6x.c @@ -3300,7 +3300,7 @@ elf32_tic6x_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) if (htab->elf.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); if (s == NULL) diff --git a/bfd/elf32-tilepro.c b/bfd/elf32-tilepro.c index cb3f896..d55be2d 100644 --- a/bfd/elf32-tilepro.c +++ b/bfd/elf32-tilepro.c @@ -2463,7 +2463,7 @@ tilepro_elf_size_dynamic_sections (bfd *output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-vax.c b/bfd/elf32-vax.c index 6089e8c..893ea8d 100644 --- a/bfd/elf32-vax.c +++ b/bfd/elf32-vax.c @@ -1124,7 +1124,7 @@ elf_vax_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf32-xtensa.c b/bfd/elf32-xtensa.c index ada3e5a..c2aef25 100644 --- a/bfd/elf32-xtensa.c +++ b/bfd/elf32-xtensa.c @@ -1641,7 +1641,7 @@ elf_xtensa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, && htab->sgotloc != NULL); /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); if (s == NULL) diff --git a/bfd/elf64-alpha.c b/bfd/elf64-alpha.c index 35c1ec6..e46f27f 100644 --- a/bfd/elf64-alpha.c +++ b/bfd/elf64-alpha.c @@ -2890,7 +2890,7 @@ elf64_alpha_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf64-hppa.c b/bfd/elf64-hppa.c index 6f40b88..3b628b4 100644 --- a/bfd/elf64-hppa.c +++ b/bfd/elf64-hppa.c @@ -1558,7 +1558,7 @@ elf64_hppa_size_dynamic_sections (bfd *output_bfd, struct bfd_link_info *info) if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { sec = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (sec != NULL); diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 5ad5f48..e5344df 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -9815,7 +9815,7 @@ ppc64_elf_size_dynamic_sections (bfd *output_bfd, if (htab->elf.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); if (s == NULL) diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c index 0264236..1c37699 100644 --- a/bfd/elf64-s390.c +++ b/bfd/elf64-s390.c @@ -1989,7 +1989,7 @@ elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->elf.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); if (s == NULL) diff --git a/bfd/elf64-sh64.c b/bfd/elf64-sh64.c index e460895..d920598 100644 --- a/bfd/elf64-sh64.c +++ b/bfd/elf64-sh64.c @@ -3404,7 +3404,7 @@ sh64_elf64_size_dynamic_sections (bfd *output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c index 2230c15..cbb8cfb 100644 --- a/bfd/elf64-x86-64.c +++ b/bfd/elf64-x86-64.c @@ -3227,7 +3227,7 @@ elf_x86_64_size_dynamic_sections (bfd *output_bfd, if (htab->elf.dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); if (s == NULL) diff --git a/bfd/elflink.c b/bfd/elflink.c index 4e52d7b..aec96e5 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -246,7 +246,7 @@ _bfd_elf_link_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info) /* A dynamically linked executable has a .interp section, but a shared library does not. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_make_section_anyway_with_flags (abfd, ".interp", flags | SEC_READONLY); @@ -5763,7 +5763,7 @@ bfd_elf_size_dynamic_sections (bfd *output_bfd, bfd_boolean all_defined; *sinterpptr = bfd_get_linker_section (dynobj, ".interp"); - BFD_ASSERT (*sinterpptr != NULL || !bfd_link_executable (info)); + BFD_ASSERT (*sinterpptr != NULL || !bfd_link_executable (info) || info->nointerp); if (soname != NULL) { diff --git a/bfd/elfnn-aarch64.c b/bfd/elfnn-aarch64.c index c9780fc..24ef79f 100644 --- a/bfd/elfnn-aarch64.c +++ b/bfd/elfnn-aarch64.c @@ -7982,7 +7982,7 @@ elfNN_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (htab->root.dynamic_sections_created) { - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); if (s == NULL) diff --git a/bfd/elfnn-ia64.c b/bfd/elfnn-ia64.c index c45fa28..3b304d5 100644 --- a/bfd/elfnn-ia64.c +++ b/bfd/elfnn-ia64.c @@ -2992,7 +2992,7 @@ elfNN_ia64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, /* Set the contents of the .interp section to the interpreter. */ if (ia64_info->root.dynamic_sections_created - && bfd_link_executable (info)) + && bfd_link_executable (info) && !info->nointerp) { sec = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (sec != NULL); diff --git a/bfd/elfxx-mips.c b/bfd/elfxx-mips.c index 5ece52d..4689b21 100644 --- a/bfd/elfxx-mips.c +++ b/bfd/elfxx-mips.c @@ -9579,7 +9579,7 @@ _bfd_mips_elf_size_dynamic_sections (bfd *output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elfxx-sparc.c b/bfd/elfxx-sparc.c index 9bb71a9..db0d4f18 100644 --- a/bfd/elfxx-sparc.c +++ b/bfd/elfxx-sparc.c @@ -2559,7 +2559,7 @@ _bfd_sparc_elf_size_dynamic_sections (bfd *output_bfd, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/bfd/elfxx-tilegx.c b/bfd/elfxx-tilegx.c index 59a2f7e..6f7485a 100644 --- a/bfd/elfxx-tilegx.c +++ b/bfd/elfxx-tilegx.c @@ -2724,7 +2724,7 @@ tilegx_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, if (elf_hash_table (info)->dynamic_sections_created) { /* Set the contents of the .interp section to the interpreter. */ - if (bfd_link_executable (info)) + if (bfd_link_executable (info) && !info->nointerp) { s = bfd_get_linker_section (dynobj, ".interp"); BFD_ASSERT (s != NULL); diff --git a/include/ChangeLog b/include/ChangeLog index 4fedda7..8b9f921 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2015-09-20 Rich Felker <dalias@libc.org> + + * bfdlink.h (struct bfd_link_info): Add "nointerp" field. + 2015-08-23 Alan Modra <amodra@gmail.com> * bfdlink.h (enum output_type): Reorder enum. diff --git a/include/bfdlink.h b/include/bfdlink.h index 43bcc6a..2ffb3d1 100644 --- a/include/bfdlink.h +++ b/include/bfdlink.h @@ -431,6 +431,9 @@ struct bfd_link_info /* TRUE if BND prefix in PLT entries is always generated. */ unsigned int bndplt: 1; + /* TRUE if generation of .interp/PT_INTERP should be suppressed. */ + unsigned int nointerp: 1; + /* Char that may appear as the first char of a symbol, but should be skipped (like symbol_leading_char) when looking up symbols in wrap_hash. Used by PowerPC Linux for 'dot' symbols. */ diff --git a/ld/ChangeLog b/ld/ChangeLog index e73abeb..e1e06b8 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2015-09-20 Rich Felker <dalias@libc.org> + + * ld.texinfo (--no-dynamic-linker): Document. + * ldlex.h (enum option_values): Add OPTION_NO_DYNAMIC_LINKER. + * lexsup.c (ld_options, parse_args): Handle --no-dynamic-linker. + 2015-09-18 Alan Modra <amodra@gmail.com> * ld.texinfo: Document PowerPC64 --{no-,}save-restore-funcs. diff --git a/ld/ld.texinfo b/ld/ld.texinfo index c5d39d5..6b7fac8 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -1455,6 +1455,13 @@ generating dynamically linked ELF executables. The default dynamic linker is normally correct; don't use this unless you know what you are doing. +@kindex --no-dynamic-linker +@item --no-dynamic-linker +When producing an executable file, omit the request for a dynamic +linker to be used at load-time. This is only meaningful for ELF +executables that contain dynamic relocations, and usually requires +entry point code that is capable of processing these relocations. + @kindex --fatal-warnings @kindex --no-fatal-warnings @item --fatal-warnings @@ -33,6 +33,7 @@ enum option_values OPTION_DEFSYM, OPTION_DEMANGLE, OPTION_DYNAMIC_LINKER, + OPTION_NO_DYNAMIC_LINKER, OPTION_SYSROOT, OPTION_EB, OPTION_EL, diff --git a/ld/lexsup.c b/ld/lexsup.c index 5dc56dc..fdd39a7 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -138,6 +138,9 @@ static const struct ld_option ld_options[] = { {"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER}, 'I', N_("PROGRAM"), N_("Set PROGRAM as the dynamic linker to use"), TWO_DASHES }, + { {"no-dynamic-linker", no_argument, NULL, OPTION_NO_DYNAMIC_LINKER}, + '\0', NULL, N_("Produce an executable with no program interpreter header"), + TWO_DASHES }, { {"library", required_argument, NULL, 'l'}, 'l', N_("LIBNAME"), N_("Search for library LIBNAME"), TWO_DASHES }, { {"library-path", required_argument, NULL, 'L'}, @@ -761,6 +764,10 @@ parse_args (unsigned argc, char **argv) case 'I': /* Used on Solaris. */ case OPTION_DYNAMIC_LINKER: command_line.interpreter = optarg; + link_info.nointerp = 0; + break; + case OPTION_NO_DYNAMIC_LINKER: + link_info.nointerp = 1; break; case OPTION_SYSROOT: /* Already handled in ldmain.c. */ |