[PATCH] ld: Add --export-dynamic-symbol and --export-dynamic-symbol-list
Fangrui Song
maskray@google.com
Mon May 11 06:46:00 GMT 2020
On 2020-05-08, H.J. Lu wrote:
>On Fri, May 8, 2020 at 8:12 AM Fangrui Song <maskray@google.com> wrote:
>>
>>
>> On 2020-05-08, H.J. Lu wrote:
>> >On Fri, May 8, 2020 at 7:54 AM Fangrui Song <maskray@google.com> wrote:
>> >>
>> >> On 2020-05-08, H.J. Lu wrote:
>> >> >On Wed, May 6, 2020 at 11:42 AM Fangrui Song <maskray@google.com> wrote:
>> >> >>
>> >> >> On 2020-05-05, H.J. Lu wrote:
>> >> >> >On Tue, May 5, 2020 at 9:55 AM Fangrui Song <maskray@google.com> wrote:
>> >> >> >>
>> >> >> >>
>> >> >> >> On 2020-05-05, H.J. Lu wrote:
>> >> >> >> >On Tue, May 5, 2020 at 8:30 AM Fangrui Song <maskray@google.com> wrote:
>> >> >> >> >>
>> >> >> >> >> On 2020-05-05, H.J. Lu wrote:
>> >> >> >> >> >On Mon, May 4, 2020 at 7:10 PM Fangrui Song <maskray@google.com> wrote:
>> >> >> >> >> >>
>> >> >> >> >> >> On 2020-05-04, H.J. Lu wrote:
>> >> >> >> >> >> >On Mon, May 4, 2020 at 10:48 AM Fangrui Song <maskray@google.com> wrote:
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> On 2020-05-03, H.J. Lu wrote:
>> >> >> >> >> >> >> >On Sat, May 2, 2020 at 11:15 PM Fangrui Song via Binutils
>> >> >> >> >> >> >> ><binutils@sourceware.org> wrote:
>> >> >> >> >> >> >> >>
>> >> >> >> >> >> >> >> PR ld/25910
>> >> >> >> >> >> >> >> * ldlang.c (export_dynamic_symbol_list): New.
>> >> >> >> >> >> >> >> (ldlang_add_export_dynamic_symbol): New.
>> >> >> >> >> >> >> >> (lang_place_export_dynamic_symbols): New.
>> >> >> >> >> >> >> >> (lang_process): Handle export_dynamic_symbol_list.
>> >> >> >> >> >> >> >> * ldlang.h (ldlang_add_export_dynamic_symbol): New.
>> >> >> >> >> >> >> >> * ldlex.h (option_values): Add OPTION_EXPORT_DYNAMIC_SYMBOL.
>> >> >> >> >> >> >> >> * lexsup.c (ld_options): Add entry for OPTION_EXPORT_DYNAMIC_SYMBOL.
>> >> >> >> >> >> >> >> (parse_args): Handle it.
>> >> >> >> >> >> >> >> * ld.texi: Add --export-dynamic-symbol documentation.
>> >> >> >> >> >> >> >> * testsuite/ld-undefined/export-dynamic-symbol.exp: Run new test.
>> >> >> >> >> >> >> >> * testsuite/ld-undefined/export-dynamic-symbol-1.d: New.
>> >> >> >> >> >> >> >> ---
>> >> >> >> >> >> >> >> ld/ld.texi | 8 +++++
>> >> >> >> >> >> >> >> ld/ldlang.c | 26 ++++++++++++++
>> >> >> >> >> >> >> >> ld/ldlang.h | 2 ++
>> >> >> >> >> >> >> >> ld/ldlex.h | 1 +
>> >> >> >> >> >> >> >> ld/lexsup.c | 7 ++++
>> >> >> >> >> >> >> >> .../ld-undefined/export-dynamic-symbol-1.d | 8 +++++
>> >> >> >> >> >> >> >> .../ld-undefined/export-dynamic-symbol.exp | 35 +++++++++++++++++++
>> >> >> >> >> >> >> >> 7 files changed, 87 insertions(+)
>> >> >> >> >> >> >> >> create mode 100644 ld/testsuite/ld-undefined/export-dynamic-symbol-1.d
>> >> >> >> >> >> >> >> create mode 100644 ld/testsuite/ld-undefined/export-dynamic-symbol.exp
>> >> >> >> >> >> >> >>
>> >> >> >> >> >> >> >> diff --git a/ld/ld.texi b/ld/ld.texi
>> >> >> >> >> >> >> >> index 4dc78e65fa..b3dc95f314 100644
>> >> >> >> >> >> >> >> --- a/ld/ld.texi
>> >> >> >> >> >> >> >> +++ b/ld/ld.texi
>> >> >> >> >> >> >> >> @@ -569,6 +569,14 @@ Note that this option is specific to ELF targeted ports. PE targets
>> >> >> >> >> >> >> >> support a similar function to export all symbols from a DLL or EXE; see
>> >> >> >> >> >> >> >> the description of @samp{--export-all-symbols} below.
>> >> >> >> >> >> >> >>
>> >> >> >> >> >> >> >> +@kindex --export-dynamic-symbol=@var{symbol}
>> >> >> >> >> >> >> >> +@cindex export dynamic symbol
>> >> >> >> >> >> >> >> +@item --export-dynamic-symbol=@var{symbol}
>> >> >> >> >> >> >> >> +Specify a symbol that should be added to the dynamic symbol table.
>> >> >> >> >> >> >> >> +Additionally, force @var{symbol} to be entered in the output file as an
>> >> >> >> >> >> >> >> +undefined symbol. Doing this may, for example, trigger linking of additional
>> >> >> >> >> >> >> >> +modules from archives.
>> >> >> >> >> >> >> >> +
>> >> >> >> >> >> >> >> @ifclear SingleFormat
>> >> >> >> >> >> >> >> @cindex big-endian objects
>> >> >> >> >> >> >> >> @cindex endianness
>> >> >> >> >> >> >> >> diff --git a/ld/ldlang.c b/ld/ldlang.c
>> >> >> >> >> >> >> >> index b2cdb3603a..e7ecdfeaf0 100644
>> >> >> >> >> >> >> >> --- a/ld/ldlang.c
>> >> >> >> >> >> >> >> +++ b/ld/ldlang.c
>> >> >> >> >> >> >> >> @@ -3910,6 +3910,26 @@ lang_place_undefineds (void)
>> >> >> >> >> >> >> >> insert_undefined (ptr->name);
>> >> >> >> >> >> >> >> }
>> >> >> >> >> >> >> >>
>> >> >> >> >> >> >> >> +static struct bfd_sym_chain export_dynamic_symbol_list = { NULL, NULL };
>> >> >> >> >> >> >> >> +
>> >> >> >> >> >> >> >> +void
>> >> >> >> >> >> >> >> +ldlang_add_export_dynamic_symbol (const char *const name)
>> >> >> >> >> >> >> >> +{
>> >> >> >> >> >> >> >> + struct bfd_sym_chain *sym;
>> >> >> >> >> >> >> >> + sym = stat_alloc (sizeof (*sym));
>> >> >> >> >> >> >> >> + sym->name = xstrdup (name);
>> >> >> >> >> >> >> >> + sym->next = export_dynamic_symbol_list.next;
>> >> >> >> >> >> >> >> + export_dynamic_symbol_list.next = sym;
>> >> >> >> >> >> >> >> +}
>> >> >> >> >> >> >> >> +
>> >> >> >> >> >> >> >> +static void
>> >> >> >> >> >> >> >> +lang_place_export_dynamic_symbols (void)
>> >> >> >> >> >> >> >> +{
>> >> >> >> >> >> >> >> + struct bfd_sym_chain *sym;
>> >> >> >> >> >> >> >> + for (sym = export_dynamic_symbol_list.next; sym != NULL; sym = sym->next)
>> >> >> >> >> >> >> >> + insert_undefined (sym->name);
>> >> >> >> >> >> >> >> +}
>> >> >> >> >> >> >> >> +
>> >> >> >> >> >> >> >> /* Structure used to build the list of symbols that the user has required
>> >> >> >> >> >> >> >> be defined. */
>> >> >> >> >> >> >> >>
>> >> >> >> >> >> >> >> @@ -7795,6 +7815,10 @@ void
>> >> >> >> >> >> >> >> lang_process (void)
>> >> >> >> >> >> >> >> {
>> >> >> >> >> >> >> >> /* Finalize dynamic list. */
>> >> >> >> >> >> >> >> + struct bfd_sym_chain *sym;
>> >> >> >> >> >> >> >> + for (sym = export_dynamic_symbol_list.next; sym != NULL; sym = sym->next)
>> >> >> >> >> >> >> >> + lang_append_dynamic_list (
>> >> >> >> >> >> >> >> + lang_new_vers_pattern (NULL, sym->name, NULL, FALSE));
>> >> >> >> >> >> >> >> if (link_info.dynamic_list)
>> >> >> >> >> >> >> >> lang_finalize_version_expr_head (&link_info.dynamic_list->head);
>> >> >> >> >> >> >> >>
>> >> >> >> >> >> >> >> @@ -7808,6 +7832,8 @@ lang_process (void)
>> >> >> >> >> >> >> >>
>> >> >> >> >> >> >> >> /* Add to the hash table all undefineds on the command line. */
>> >> >> >> >> >> >> >> lang_place_undefineds ();
>> >> >> >> >> >> >> >> + /* Add --export-dynamic-symbol symbols to the hash table. */
>> >> >> >> >> >> >> >> + lang_place_export_dynamic_symbols ();
>> >> >> >> >> >> >> >>
>> >> >> >> >> >> >> >> if (!bfd_section_already_linked_table_init ())
>> >> >> >> >> >> >> >> einfo (_("%F%P: can not create hash table: %E\n"));
>> >> >> >> >> >> >> >> diff --git a/ld/ldlang.h b/ld/ldlang.h
>> >> >> >> >> >> >> >> index 2aa3930f95..8c004b173c 100644
>> >> >> >> >> >> >> >> --- a/ld/ldlang.h
>> >> >> >> >> >> >> >> +++ b/ld/ldlang.h
>> >> >> >> >> >> >> >> @@ -606,6 +606,8 @@ extern lang_output_section_statement_type *next_matching_output_section_statemen
>> >> >> >> >> >> >> >> (lang_output_section_statement_type *, int);
>> >> >> >> >> >> >> >> extern void ldlang_add_undef
>> >> >> >> >> >> >> >> (const char *const, bfd_boolean);
>> >> >> >> >> >> >> >> +extern void ldlang_add_export_dynamic_symbol
>> >> >> >> >> >> >> >> + (const char *const);
>> >> >> >> >> >> >> >> extern void ldlang_add_require_defined
>> >> >> >> >> >> >> >> (const char *const);
>> >> >> >> >> >> >> >> extern void lang_add_output_format
>> >> >> >> >> >> >> >> diff --git a/ld/ldlex.h b/ld/ldlex.h
>> >> >> >> >> >> >> >> index 22b928d2d9..70f2da5636 100644
>> >> >> >> >> >> >> >> --- a/ld/ldlex.h
>> >> >> >> >> >> >> >> +++ b/ld/ldlex.h
>> >> >> >> >> >> >> >> @@ -81,6 +81,7 @@ enum option_values
>> >> >> >> >> >> >> >> OPTION_DYNAMIC_LIST_CPP_NEW,
>> >> >> >> >> >> >> >> OPTION_DYNAMIC_LIST_CPP_TYPEINFO,
>> >> >> >> >> >> >> >> OPTION_DYNAMIC_LIST_DATA,
>> >> >> >> >> >> >> >> + OPTION_EXPORT_DYNAMIC_SYMBOL,
>> >> >> >> >> >> >> >> OPTION_WARN_COMMON,
>> >> >> >> >> >> >> >> OPTION_WARN_CONSTRUCTORS,
>> >> >> >> >> >> >> >> OPTION_WARN_FATAL,
>> >> >> >> >> >> >> >> diff --git a/ld/lexsup.c b/ld/lexsup.c
>> >> >> >> >> >> >> >> index d1955b9afa..0a0c2f2873 100644
>> >> >> >> >> >> >> >> --- a/ld/lexsup.c
>> >> >> >> >> >> >> >> +++ b/ld/lexsup.c
>> >> >> >> >> >> >> >> @@ -504,6 +504,8 @@ static const struct ld_option ld_options[] =
>> >> >> >> >> >> >> >> '\0', NULL, N_("Use C++ typeinfo dynamic list"), TWO_DASHES },
>> >> >> >> >> >> >> >> { {"dynamic-list", required_argument, NULL, OPTION_DYNAMIC_LIST},
>> >> >> >> >> >> >> >> '\0', N_("FILE"), N_("Read dynamic list"), TWO_DASHES },
>> >> >> >> >> >> >> >> + { {"export-dynamic-symbol", required_argument, NULL, OPTION_EXPORT_DYNAMIC_SYMBOL},
>> >> >> >> >> >> >> >> + '\0', N_("SYMBOL"), N_("Read dynamic list"), TWO_DASHES },
>> >> >> >> >> >> >> >> { {"warn-common", no_argument, NULL, OPTION_WARN_COMMON},
>> >> >> >> >> >> >> >> '\0', NULL, N_("Warn about duplicate common symbols"), TWO_DASHES },
>> >> >> >> >> >> >> >> { {"warn-constructors", no_argument, NULL, OPTION_WARN_CONSTRUCTORS},
>> >> >> >> >> >> >> >> @@ -1425,6 +1427,11 @@ parse_args (unsigned argc, char **argv)
>> >> >> >> >> >> >> >> if (opt_symbolic == symbolic)
>> >> >> >> >> >> >> >> opt_symbolic = symbolic_unset;
>> >> >> >> >> >> >> >> break;
>> >> >> >> >> >> >> >> + case OPTION_EXPORT_DYNAMIC_SYMBOL:
>> >> >> >> >> >> >> >> + ldlang_add_export_dynamic_symbol (optarg);
>> >> >> >> >> >> >> >> + if (opt_dynamic_list != dynamic_list_data)
>> >> >> >> >> >> >> >> + opt_dynamic_list = dynamic_list;
>> >> >> >> >> >> >> >> + break;
>> >> >> >> >> >> >> >> case OPTION_WARN_COMMON:
>> >> >> >> >> >> >> >> config.warn_common = TRUE;
>> >> >> >> >> >> >> >> break;
>> >> >> >> >> >> >> >> diff --git a/ld/testsuite/ld-undefined/export-dynamic-symbol-1.d b/ld/testsuite/ld-undefined/export-dynamic-symbol-1.d
>> >> >> >> >> >> >> >> new file mode 100644
>> >> >> >> >> >> >> >> index 0000000000..768bf0abd6
>> >> >> >> >> >> >> >> --- /dev/null
>> >> >> >> >> >> >> >> +++ b/ld/testsuite/ld-undefined/export-dynamic-symbol-1.d
>> >> >> >> >> >> >> >> @@ -0,0 +1,8 @@
>> >> >> >> >> >> >> >> +#name: --export-dynamic-symbol foo archive
>> >> >> >> >> >> >> >> +#source: require-defined.s
>> >> >> >> >> >> >> >> +#ld: -pie --export-dynamic-symbol foo tmpdir/libentry.a
>> >> >> >> >> >> >> >
>> >> >> >> >> >> >> >I assume that it supports
>> >> >> >> >> >> >> >
>> >> >> >> >> >> >> >$ ld -pie --export-dynamic-symbol foo --export-dynamic-symbol bar ...
>> >> >> >> >> >> >> >
>> >> >> >> >> >> >> >Please add another --export-dynamic-symbol to your test.
>> >> >> >> >> >> >> >
>> >> >> >> >> >> >> >--
>> >> >> >> >> >> >> >H.J.
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> I face a test difficulty. If I add another `#nm:`, runtest complains:
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> % cd Debug/ld
>> >> >> >> >> >> >> % runtest --tool ld --srcdir ../../ld/testsuite/ export-dynamic-symbol.exp
>> >> >> >> >> >> >> ...
>> >> >> >> >> >> >> ERROR: option nm multiply set in ../../ld/testsuite/ld-undefined/export-dynamic-symbol-1.d
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> There may also be a problem of symbol table order determinism. I don't
>> >> >> >> >> >> >> know whether another symbol may be ordered before foo in some ports and
>> >> >> >> >> >> >> after foo in other ports.
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> Honestly, I think for a number of tests, even if they test generic
>> >> >> >> >> >> >> behavior, it might be fine to restrict them to run on certain hosts,
>> >> >> >> >> >> >> e.g. Linux x86. What I know about testing is lacking, though, I don't
>> >> >> >> >> >> >> know what can be tested.
>> >> >> >> >> >> >>
>> >> >> >> >> >> >> Ideally `#nm:` should just be free-form shell scripts but unfortunately
>> >> >> >> >> >> >> it seems to support very limited features (undocumented?)
>> >> >> >> >> >> >
>> >> >> >> >> >> >You can't add another #nm. But you can pass additional options to nm.
>> >> >> >> >> >> >
>> >> >> >> >> >> >--
>> >> >> >> >> >> >H.J.
>> >> >> >> >> >>
>> >> >> >> >> >> Attached PATCH v2.
>> >> >> >> >> >>
>> >> >> >> >> >> Added export-dynamic-symbol-2.d
>> >> >> >> >> >
>> >> >> >> >> >There is
>> >> >> >> >> >
>> >> >> >> >> >'--dynamic-list=DYNAMIC-LIST-FILE'
>> >> >> >> >> > Specify the name of a dynamic list file to the linker. This is
>> >> >> >> >> > typically used when creating shared libraries to specify a list of
>> >> >> >> >> > global symbols whose references shouldn't be bound to the
>> >> >> >> >> > definition within the shared library, or creating dynamically
>> >> >> >> >> > linked executables to specify a list of symbols which should be
>> >> >> >> >> > added to the symbol table in the executable. This option is only
>> >> >> >> >> > meaningful on ELF platforms which support shared libraries.
>> >> >> >> >> >
>> >> >> >> >> >The new --export-dynamic-symbol option puts it on command-line
>> >> >> >> >> >and implicitly adds -u. This makes the new option different from
>> >> >> >> >> >--dynamic-list. I don't think -u should be added implicitly. If needed,
>> >> >> >> >> >you should add another option to add -u for all symbols on dynamic
>> >> >> >> >> >list.
>> >> >> >> >> >
>> >> >> >> >> >--
>> >> >> >> >> >H.J.
>> >> >> >> >>
>> >> >> >> >> I would also hope gold did not add -u. I don't particularly like it (see
>> >> >> >> >> also https://reviews.llvm.org/D43103)
>> >> >> >> >
>> >> >> >> >Please drop implicit -u.
>> >> >> >>
>> >> >> >> Done. Attached PATCH v3.
>> >> >> >> Improved tests to check a glob pattern and multiple --export-dynamic-symbol.
>> >> >> >>
>> >> >> >> Moved ld-undefined/ to ld-dynamic/ since the feature is decoupled from -u now.
>> >> >> >>
>> >> >> >> >> If you think we can correct this, I think it should be fine.
>> >> >> >> >
>> >> >> >> >Please open a gold bug for this.
>> >> >> >> >
>> >> >> >> >Thanks.
>> >> >> >> >
>> >> >> >> >--
>> >> >> >> >H.J.
>> >> >> >>
>> >> >> >> Filed https://sourceware.org/bugzilla/show_bug.cgi?id=25925 (--export-dynamic-symbol should drop implicit -u)
>> >> >> >>
>> >> >> >>
>> >> >> >> I may have to migrate some internal projects if they rely on the
>> >> >> >> --export-dynamic-symbol semantics, but hopefully there will not be much
>> >> >> >> work. I am glad that --export-dynamic-symbol semantic will be orthogonal!
>> >> >> >
>> >> >> >+ case OPTION_EXPORT_DYNAMIC_SYMBOL:
>> >> >> >+ ldlang_add_export_dynamic_symbol (optarg);
>> >> >> >
>> >> >> >Can you simply call
>> >> >> >
>> >> >> >lang_append_dynamic_list (lang_new_vers_pattern (NULL, optarg, NULL, FALSE));
>> >> >> >
>> >> >> >here?
>> >> >> >
>> >> >> >--
>> >> >> >H.J.
>> >> >>
>> >> >> Attached PATCH v4, which also handles -shared. The previous patches do not handle -shared.
>> >> >> Added two tests to ld-elf/shared.exp
>> >> >>
>> >> >> The updated semantics:
>> >> >>
>> >> >> + @kindex --export-dynamic-symbol=@var{glob}
>> >> >> + @cindex export dynamic symbol
>> >> >> + @item --export-dynamic-symbol=@var{glob}
>> >> >> + When creating a dynamically linked executable, symbols matching
>> >> >> + @var{glob} will be added to the dynamic symbol table. When creating a
>> >> >> + shared library, references to symbols matching @var{glob} will not be
>> >> >> + bound to the definitions within the shared library. This option is a
>> >> >> + no-op when creating a shared library and @samp{--dynamic-list} is not
>> >> >> + specified. This option is only meaningful on ELF platforms which
>> >> >> + support shared libraries.
>> >> >>
>> >> >> i.e. --export-dynamic-symbol is like addition to --dynamic-list,
>> >> >> except: -shared --export-dynamic-symbol without --dynamic-list will not
>> >> >> act as -Bsymbolic.
>> >> >>
>> >> >> In the option processing loop, we cannot call lang_append_dynamic_list
>> >> >> because when -shared is specified but --dynamic-list is not specified,
>> >> >> --export-dynamic-symbol should be a no-op.
>> >> >
>> >> >--dynamic-list implies -Bsymbolic. If we add --export-dynamic-symbol,
>> >> >we should also add --export-dynamic-symbol-list, which is similar to
>> >> >--dynamic-list, but without -Bsymbolic.
>> >>
>> >> --export-dynamic-symbol-list a.list where a.list is a plain text like:
>> >> foo
>> >> bar
>> >> ?
>> >
>> >I prefer to use the same format as --dynamic-list.
>> >
>> >> The feature can be provided by a response file @a.rsp
>> >> --export-dynamic-symbol foo
>> >> --export-dynamic-symbol bar
>>
>> Adding --export-dynamic-symbol-list is fine. We can implement that separately.
>
>Since implement --export-dynamic-symbol-list at the same time may impact how
>--export-dynamic-symbol is implemented, they should be added together.
OK. Added --export-dynamic-symbol-list as well.
Retitled.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-ld-Add-export-dynamic-symbol-and-export-dynamic-symb.patch
Type: text/x-diff
Size: 19726 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20200510/337f7563/attachment-0001.bin>
More information about the Binutils
mailing list