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>
|
2020-03-13 Kamil Rytarowski <n54@gmx.com>
|
||||||
|
|
||||||
* elf.c (elfcore_grok_netbsd_note): Add support for aarch64.
|
* 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. */
|
/* TRUE if generate a 1-byte NOP as suffix for x86 call instruction. */
|
||||||
unsigned int call_nop_as_suffix : 1;
|
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. */
|
/* Report missing IBT and SHSTK properties. */
|
||||||
enum elf_x86_cet_report cet_report;
|
enum elf_x86_cet_report cet_report;
|
||||||
|
|
||||||
|
@ -2998,6 +2998,23 @@ _bfd_x86_elf_link_setup_gnu_properties
|
|||||||
: bed->plt_alignment);
|
: 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;
|
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>
|
2020-03-13 Christian Eggers <ceggers@gmx.de>
|
||||||
|
|
||||||
* ldexp.c (fold_name): Return SIZEOF_HEADERS in bytes.
|
* 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/reloc_overflow.sh
|
||||||
source_sh ${srcdir}/emulparams/call_nop.sh
|
source_sh ${srcdir}/emulparams/call_nop.sh
|
||||||
source_sh ${srcdir}/emulparams/cet.sh
|
source_sh ${srcdir}/emulparams/cet.sh
|
||||||
|
source_sh ${srcdir}/emulparams/static.sh
|
||||||
SCRIPT_NAME=elf
|
SCRIPT_NAME=elf
|
||||||
ELFSIZE=32
|
ELFSIZE=32
|
||||||
OUTPUT_FORMAT="elf32-x86-64"
|
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/dynamic_undefined_weak.sh
|
||||||
source_sh ${srcdir}/emulparams/call_nop.sh
|
source_sh ${srcdir}/emulparams/call_nop.sh
|
||||||
source_sh ${srcdir}/emulparams/cet.sh
|
source_sh ${srcdir}/emulparams/cet.sh
|
||||||
|
source_sh ${srcdir}/emulparams/static.sh
|
||||||
SCRIPT_NAME=elf
|
SCRIPT_NAME=elf
|
||||||
OUTPUT_FORMAT="elf32-i386"
|
OUTPUT_FORMAT="elf32-i386"
|
||||||
NO_RELA_RELOCS=yes
|
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/reloc_overflow.sh
|
||||||
source_sh ${srcdir}/emulparams/call_nop.sh
|
source_sh ${srcdir}/emulparams/call_nop.sh
|
||||||
source_sh ${srcdir}/emulparams/cet.sh
|
source_sh ${srcdir}/emulparams/cet.sh
|
||||||
|
source_sh ${srcdir}/emulparams/static.sh
|
||||||
SCRIPT_NAME=elf
|
SCRIPT_NAME=elf
|
||||||
ELFSIZE=64
|
ELFSIZE=64
|
||||||
OUTPUT_FORMAT="elf64-x86-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
|
fragment <<EOF
|
||||||
|
|
||||||
|
#include "ldlex.h"
|
||||||
#include "elf-linker-x86.h"
|
#include "elf-linker-x86.h"
|
||||||
|
|
||||||
static struct elf_linker_x86_params params;
|
static struct elf_linker_x86_params params;
|
||||||
|
@ -19,11 +19,36 @@
|
|||||||
# MA 02110-1301, USA.
|
# 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.
|
# Test very simple native Linux/x86 programs with linux-x86.S.
|
||||||
if { ![isnative] || ![check_compiler_available] \
|
if { ![isnative] || ![check_compiler_available] } {
|
||||||
|| (![istarget "i?86-*-linux*"] \
|
|
||||||
&& ![istarget "x86_64-*-linux*"] \
|
|
||||||
&& ![istarget "amd64-*-linux*"]) } {
|
|
||||||
return
|
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