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:
H.J. Lu 2020-03-13 07:34:56 -07:00
parent 2d61316c32
commit 74e10d1742
11 changed files with 90 additions and 4 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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;
}

View File

@ -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.

View File

@ -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"

View File

@ -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

View File

@ -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
View 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;
"

View File

@ -22,6 +22,7 @@
#
fragment <<EOF
#include "ldlex.h"
#include "elf-linker-x86.h"
static struct elf_linker_x86_params params;

View File

@ -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
}

View File

@ -0,0 +1 @@
.*: attempted static link of dynamic object `tmpdir/pr24920.so'