diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 17 | ||||
-rw-r--r-- | ld/NEWS | 2 | ||||
-rw-r--r-- | ld/emultempl/elf.em | 4 | ||||
-rw-r--r-- | ld/ld.texi | 6 | ||||
-rw-r--r-- | ld/lexsup.c | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/elf.exp | 121 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr26391.nd | 7 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr26391.out | 3 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr26391a.c | 18 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr26391b.c | 13 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr26391c.c | 13 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/pr26391d.c | 13 |
12 files changed, 221 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index d81ebcc..8d63f66 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,20 @@ +2020-09-12 H.J. Lu <hongjiu.lu@intel.com> + + PR ld/26391 + * NEWS: Mention "-z unique-symbol". + * emultempl/elf.em (gld${EMULATION_NAME}_handle_option): Handle + "-z unique-symbol" and "-z nounique-symbol". + * ld.texi: Document "-z unique-symbol" and "-z nounique-symbol". + * lexsup.c (elf_static_list_options): Add "-z unique-symbol" and + "-z nounique-symbol". + * testsuite/ld-elf/elf.exp: Add PR ld/26391 tests. + * testsuite/ld-elf/pr26391.nd: New file. + * testsuite/ld-elf/pr26391.out: Likewise. + * testsuite/ld-elf/pr26391a.c: Likewise. + * testsuite/ld-elf/pr26391b.c: Likewise. + * testsuite/ld-elf/pr26391c.c: Likewise. + * testsuite/ld-elf/pr26391d.c: Likewise. + 2020-09-11 Jeremy Drake <sourceware-bugzilla@jdrake.com> PR 26588 @@ -1,5 +1,7 @@ -*- text -*- +* Add -z unique-symbol to avoid duplicated local symbol names. + * The creation of PE format DLLs now defaults to using a more secure set of DLL characteristics. diff --git a/ld/emultempl/elf.em b/ld/emultempl/elf.em index 356f345..59eed70 100644 --- a/ld/emultempl/elf.em +++ b/ld/emultempl/elf.em @@ -751,6 +751,10 @@ fragment <<EOF link_info.noexecstack = TRUE; link_info.execstack = FALSE; } + else if (strcmp (optarg, "unique-symbol") == 0) + link_info.unique_symbol = TRUE; + else if (strcmp (optarg, "nounique-symbol") == 0) + link_info.unique_symbol = FALSE; else if (strcmp (optarg, "globalaudit") == 0) { link_info.flags_1 |= DF_1_GLOBAUDIT; @@ -1378,6 +1378,12 @@ specifies a memory segment that should contain only instructions and must be in wholly disjoint pages from any other data. Don't create separate code @code{PT_LOAD} segment if @samp{noseparate-code} is used. +@item unique-symbol +@itemx nounique-symbol +Avoid duplicated local symbol names in the symbol string table. Append +".@code{number}" to duplicated local symbol names if @samp{unique-symbol} +is used. @option{nounique-symbol} is the default. + @item shstk Generate GNU_PROPERTY_X86_FEATURE_1_SHSTK in .note.gnu.property section to indicate compatibility with Intel Shadow Stack. Supported for diff --git a/ld/lexsup.c b/ld/lexsup.c index b9cc8a1..b8f0667 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -2050,6 +2050,10 @@ elf_static_list_options (FILE *file) fprintf (file, _("\ -z noexecstack Mark executable as not requiring executable stack\n")); fprintf (file, _("\ + -z unique-symbol Avoid duplicated local symbol names\n")); + fprintf (file, _("\ + -z nounique-symbol Keep duplicated local symbol names (default)\n")); + fprintf (file, _("\ -z globalaudit Mark executable requiring global auditing\n")); } diff --git a/ld/testsuite/ld-elf/elf.exp b/ld/testsuite/ld-elf/elf.exp index c0d67d8..f2ff039 100644 --- a/ld/testsuite/ld-elf/elf.exp +++ b/ld/testsuite/ld-elf/elf.exp @@ -359,4 +359,125 @@ if { [istarget *-*-linux*] run_ld_link_exec_tests $array_tests_static $xfails +run_cc_link_tests [list \ + [list \ + "Build pr26391-1" \ + "-Wl,-z,unique-symbol" \ + "-fno-function-sections" \ + {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \ + {{nm "" pr26391.nd}} \ + "pr26391-1" \ + ] \ + [list \ + "Build pr26391-2" \ + "-Wl,-z,unique-symbol" \ + "-ffunction-sections" \ + {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \ + {{nm "" pr26391.nd}} \ + "pr26391-2" \ + ] \ + [list \ + "Build pr26391-3" \ + "-Wl,-z,unique-symbol,--emit-relocs" \ + "-fno-function-sections" \ + {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \ + {{nm "" pr26391.nd}} \ + "pr26391-3" \ + ] \ + [list \ + "Build pr26391-4" \ + "-Wl,-z,unique-symbol,--emit-relocs" \ + "-ffunction-sections" \ + {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \ + {{nm "" pr26391.nd}} \ + "pr26391-4" \ + ] \ +] + +run_ld_link_tests [list \ + [list \ + "Build pr26391-5.o" \ + "-z unique-symbol -r" \ + "" \ + "" \ + {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \ + {{nm "" pr26391.nd}} \ + "pr26391-5.o" \ + "-fno-function-sections" \ + ] \ + [list \ + "Build pr26391-6.o" \ + "-z unique-symbol -r" \ + "" \ + "" \ + {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \ + {{nm "" pr26391.nd}} \ + "pr26391-6.o" \ + "-ffunction-sections" \ + ] \ +] + +run_ld_link_exec_tests [list \ + [list \ + "Run pr26391-1" \ + "-Wl,-z,unique-symbol" \ + "" \ + {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \ + "pr26391-1" \ + "pr26391.out" \ + "-fno-function-sections" \ + ] \ + [list \ + "Run pr26391-2" \ + "-Wl,-z,unique-symbol" \ + "" \ + {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \ + "pr26391-2" \ + "pr26391.out" \ + "-ffunction-sections" \ + ] \ + [list \ + "Run pr26391-3" \ + "-Wl,-z,unique-symbol,--emit-relocs" \ + "" \ + {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \ + "pr26391-3" \ + "pr26391.out" \ + "-fno-function-sections" \ + ] \ + [list \ + "Run pr26391-4" \ + "-Wl,-z,unique-symbol,--emit-relocs" \ + "" \ + {pr26391a.c pr26391b.c pr26391c.c pr26391d.c} \ + "pr26391-4" \ + "pr26391.out" \ + "-ffunction-sections" \ + ] \ + [list \ + "Run pr26391-5" \ + "-Wl,-z,unique-symbol" \ + "" \ + {dummy.c} \ + "pr26391-5" \ + "pr26391.out" \ + "" \ + "c" \ + "" \ + "tmpdir/pr26391-5.o" \ + ] \ + [list \ + "Run pr26391-6" \ + "-Wl,-z,unique-symbol" \ + "" \ + {dummy.c} \ + "pr26391-6" \ + "pr26391.out" \ + "" \ + "c" \ + "" \ + "tmpdir/pr26391-6.o" \ + ] \ +] + catch "exec rm -f tmpdir/preinit tmpdir/init tmpdir/fini tmpdir/init-mixed" status diff --git a/ld/testsuite/ld-elf/pr26391.nd b/ld/testsuite/ld-elf/pr26391.nd new file mode 100644 index 0000000..8dd48d9 --- /dev/null +++ b/ld/testsuite/ld-elf/pr26391.nd @@ -0,0 +1,7 @@ +#... +[0-9a-z]+ t _?bar +#... +[0-9a-z]+ t _?bar.1 +#... +[0-9a-z]+ t _?bar.2 +#pass diff --git a/ld/testsuite/ld-elf/pr26391.out b/ld/testsuite/ld-elf/pr26391.out new file mode 100644 index 0000000..73654ee --- /dev/null +++ b/ld/testsuite/ld-elf/pr26391.out @@ -0,0 +1,3 @@ +bar 1 +bar 2 +bar 3 diff --git a/ld/testsuite/ld-elf/pr26391a.c b/ld/testsuite/ld-elf/pr26391a.c new file mode 100644 index 0000000..7356d9d --- /dev/null +++ b/ld/testsuite/ld-elf/pr26391a.c @@ -0,0 +1,18 @@ +typedef void (*func_p) (void); + +extern func_p bar1_p (void); +extern func_p bar2_p (void); +extern func_p bar3_p (void); + +int +main () +{ + func_p f; + f = bar1_p (); + f (); + f = bar2_p (); + f (); + f = bar3_p (); + f (); + return 0; +} diff --git a/ld/testsuite/ld-elf/pr26391b.c b/ld/testsuite/ld-elf/pr26391b.c new file mode 100644 index 0000000..8f716a5 --- /dev/null +++ b/ld/testsuite/ld-elf/pr26391b.c @@ -0,0 +1,13 @@ +#include <stdio.h> + +static void +bar (void) +{ + printf ("bar 1\n"); +} + +void * +bar1_p (void) +{ + return bar; +} diff --git a/ld/testsuite/ld-elf/pr26391c.c b/ld/testsuite/ld-elf/pr26391c.c new file mode 100644 index 0000000..e5bf1c1 --- /dev/null +++ b/ld/testsuite/ld-elf/pr26391c.c @@ -0,0 +1,13 @@ +#include <stdio.h> + +static void +bar (void) +{ + printf ("bar 2\n"); +} + +void * +bar2_p (void) +{ + return bar; +} diff --git a/ld/testsuite/ld-elf/pr26391d.c b/ld/testsuite/ld-elf/pr26391d.c new file mode 100644 index 0000000..6e388f8 --- /dev/null +++ b/ld/testsuite/ld-elf/pr26391d.c @@ -0,0 +1,13 @@ +#include <stdio.h> + +static void +bar (void) +{ + printf ("bar 3\n"); +} + +void * +bar3_p (void) +{ + return bar; +} |