x86: Check static link of dynamic objects
On Linux/x86, when -static is passed to gcc, gcc passes it to linker before all input files suitable for creating static executable. X86 linker will report error for dynamic input objects if -static is passed at command-line before all input files without --dynamic-linker unless --no-dynamic-linker is used. bfd/ PR ld/24920 * elf-linker-x86.h (elf_linker_x86_params): Add static_before_all_inputs and has_dynamic_linker. * elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties): Report dynamic input objects if -static is passed at command-line before all input files without --dynamic-linker unless --no-dynamic-linker is used. ld/ PR ld/24920 * emulparams/elf32_x86_64.sh: Use static.sh. * emulparams/elf_i386.sh: Likewise. * emulparams/elf_x86_64.sh: Likewise. * emulparams/static.sh: New file. * emultempl/elf-x86.em: Include "ldlex.h". * testsuite/ld-elf/pr24920.err: New file. * testsuite/ld-elf/linux-x86.exp: Run ld/24920 tests.
This commit is contained in:
parent
2d61316c32
commit
74e10d1742
@ -1,3 +1,13 @@
|
||||
2020-03-13 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/24920
|
||||
* elf-linker-x86.h (elf_linker_x86_params): Add
|
||||
static_before_all_inputs and has_dynamic_linker.
|
||||
* elfxx-x86.c (_bfd_x86_elf_link_setup_gnu_properties): Report
|
||||
dynamic input objects if -static is passed at command-line
|
||||
before all input files without --dynamic-linker unless
|
||||
--no-dynamic-linker is used.
|
||||
|
||||
2020-03-13 Kamil Rytarowski <n54@gmx.com>
|
||||
|
||||
* elf.c (elfcore_grok_netbsd_note): Add support for aarch64.
|
||||
|
@ -49,6 +49,12 @@ struct elf_linker_x86_params
|
||||
/* TRUE if generate a 1-byte NOP as suffix for x86 call instruction. */
|
||||
unsigned int call_nop_as_suffix : 1;
|
||||
|
||||
/* TRUE if -static is passed at command-line before all input files. */
|
||||
unsigned int static_before_all_inputs : 1;
|
||||
|
||||
/* TRUE if --dynamic-linker is passed at command-line. */
|
||||
unsigned int has_dynamic_linker : 1;
|
||||
|
||||
/* Report missing IBT and SHSTK properties. */
|
||||
enum elf_x86_cet_report cet_report;
|
||||
|
||||
|
@ -2998,6 +2998,23 @@ _bfd_x86_elf_link_setup_gnu_properties
|
||||
: bed->plt_alignment);
|
||||
}
|
||||
|
||||
if (bfd_link_executable (info)
|
||||
&& !info->nointerp
|
||||
&& !htab->params->has_dynamic_linker
|
||||
&& htab->params->static_before_all_inputs)
|
||||
{
|
||||
/* Report error for dynamic input objects if -static is passed at
|
||||
command-line before all input files without --dynamic-linker
|
||||
unless --no-dynamic-linker is used. */
|
||||
bfd *abfd;
|
||||
|
||||
for (abfd = info->input_bfds; abfd != NULL; abfd = abfd->link.next)
|
||||
if ((abfd->flags & DYNAMIC))
|
||||
info->callbacks->einfo
|
||||
(_("%X%P: attempted static link of dynamic object `%pB'\n"),
|
||||
abfd);
|
||||
}
|
||||
|
||||
return pbfd;
|
||||
}
|
||||
|
||||
|
11
ld/ChangeLog
11
ld/ChangeLog
@ -1,3 +1,14 @@
|
||||
2020-03-13 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR ld/24920
|
||||
* emulparams/elf32_x86_64.sh: Use static.sh.
|
||||
* emulparams/elf_i386.sh: Likewise.
|
||||
* emulparams/elf_x86_64.sh: Likewise.
|
||||
* emulparams/static.sh: New file.
|
||||
* emultempl/elf-x86.em: Include "ldlex.h".
|
||||
* testsuite/ld-elf/pr24920.err: New file.
|
||||
* testsuite/ld-elf/linux-x86.exp: Run ld/24920 tests.
|
||||
|
||||
2020-03-13 Christian Eggers <ceggers@gmx.de>
|
||||
|
||||
* ldexp.c (fold_name): Return SIZEOF_HEADERS in bytes.
|
||||
|
@ -4,6 +4,7 @@ source_sh ${srcdir}/emulparams/dynamic_undefined_weak.sh
|
||||
source_sh ${srcdir}/emulparams/reloc_overflow.sh
|
||||
source_sh ${srcdir}/emulparams/call_nop.sh
|
||||
source_sh ${srcdir}/emulparams/cet.sh
|
||||
source_sh ${srcdir}/emulparams/static.sh
|
||||
SCRIPT_NAME=elf
|
||||
ELFSIZE=32
|
||||
OUTPUT_FORMAT="elf32-x86-64"
|
||||
|
@ -3,6 +3,7 @@ source_sh ${srcdir}/emulparams/extern_protected_data.sh
|
||||
source_sh ${srcdir}/emulparams/dynamic_undefined_weak.sh
|
||||
source_sh ${srcdir}/emulparams/call_nop.sh
|
||||
source_sh ${srcdir}/emulparams/cet.sh
|
||||
source_sh ${srcdir}/emulparams/static.sh
|
||||
SCRIPT_NAME=elf
|
||||
OUTPUT_FORMAT="elf32-i386"
|
||||
NO_RELA_RELOCS=yes
|
||||
|
@ -4,6 +4,7 @@ source_sh ${srcdir}/emulparams/dynamic_undefined_weak.sh
|
||||
source_sh ${srcdir}/emulparams/reloc_overflow.sh
|
||||
source_sh ${srcdir}/emulparams/call_nop.sh
|
||||
source_sh ${srcdir}/emulparams/cet.sh
|
||||
source_sh ${srcdir}/emulparams/static.sh
|
||||
SCRIPT_NAME=elf
|
||||
ELFSIZE=64
|
||||
OUTPUT_FORMAT="elf64-x86-64"
|
||||
|
12
ld/emulparams/static.sh
Normal file
12
ld/emulparams/static.sh
Normal file
@ -0,0 +1,12 @@
|
||||
PARSE_AND_LIST_ARGS_CASES="$PARSE_AND_LIST_ARGS_CASES
|
||||
case OPTION_DYNAMIC_LINKER:
|
||||
params.has_dynamic_linker = TRUE;
|
||||
return FALSE;
|
||||
|
||||
case OPTION_NON_SHARED:
|
||||
/* Check if -static is passed at command-line before all input
|
||||
files. */
|
||||
if (!lang_has_input_file)
|
||||
params.static_before_all_inputs = TRUE;
|
||||
return FALSE;
|
||||
"
|
@ -22,6 +22,7 @@
|
||||
#
|
||||
fragment <<EOF
|
||||
|
||||
#include "ldlex.h"
|
||||
#include "elf-linker-x86.h"
|
||||
|
||||
static struct elf_linker_x86_params params;
|
||||
|
@ -19,11 +19,36 @@
|
||||
# MA 02110-1301, USA.
|
||||
#
|
||||
|
||||
# Linux/x86 tests.
|
||||
if { ![istarget "i?86-*-linux*"] \
|
||||
&& ![istarget "x86_64-*-linux*"] \
|
||||
&& ![istarget "amd64-*-linux*"] } {
|
||||
return
|
||||
}
|
||||
|
||||
run_ld_link_tests [list \
|
||||
[list \
|
||||
"Build pr24920.so" \
|
||||
"-shared" \
|
||||
"" \
|
||||
"" \
|
||||
{dummy.s} \
|
||||
{} \
|
||||
"pr24920.so" \
|
||||
] \
|
||||
[list \
|
||||
"Build pr24920" \
|
||||
"-static " \
|
||||
"-Bdynamic tmpdir/pr24920.so" \
|
||||
"" \
|
||||
{start.s} \
|
||||
{{ld pr24920.err}} \
|
||||
"pr24920" \
|
||||
] \
|
||||
]
|
||||
|
||||
# Test very simple native Linux/x86 programs with linux-x86.S.
|
||||
if { ![isnative] || ![check_compiler_available] \
|
||||
|| (![istarget "i?86-*-linux*"] \
|
||||
&& ![istarget "x86_64-*-linux*"] \
|
||||
&& ![istarget "amd64-*-linux*"]) } {
|
||||
if { ![isnative] || ![check_compiler_available] } {
|
||||
return
|
||||
}
|
||||
|
||||
|
1
ld/testsuite/ld-elf/pr24920.err
Normal file
1
ld/testsuite/ld-elf/pr24920.err
Normal file
@ -0,0 +1 @@
|
||||
.*: attempted static link of dynamic object `tmpdir/pr24920.so'
|
Loading…
Reference in New Issue
Block a user