Hi. With change of -fno-common default for GCC 10 we're facing serious problem with LTO where one can't distinguish in between global symbols and variables based on the output of nm: https://sourceware.org/bugzilla/show_bug.cgi?id=25355
$ cat nm.c char nm_test_var; $ gcc-9 nm.c -c -fno-common $ nm nm.o 0000000000000000 B nm_test_var $ gcc-9 nm.c -c -fno-common -flto $ nm nm.o 00000000 T nm_test_var H.J. decided to implement quite heavy solution which is about usage of lto-wrapper that takes a LTO object file and makes a final assembly file. The file is then utilized with nm. That has some disadvantages: - it's slow - using nm x.a can take very long time - way of finding lto-wrapper is quite hard-coded to location of LTO plugin - we face issues with multiple final object files: https://sourceware.org/bugzilla/show_bug.cgi?id=25640 That said, I'm suggesting to expect LTO plugin API to tell binutils whether a symbol is variable or function. That should help us to mark global variables with "D" in nm output. I would like to note that even with -fcommon, the nm output for LTO bytecode is far from perfect: $ cat bss.c int global_zero; int global_one = 1; $ gcc-9 bss.c -c -flto $ nm bss.o 00000000 T global_one 00000000 C global_zero I believe in this case we can mark both symbols with D as a reasonable guess. Thoughts? Martin gcc/ChangeLog: 2020-03-09 Martin Liska <mli...@suse.cz> * lto-streamer-out.c (write_symbol): Stream symbol type. include/ChangeLog: 2020-03-09 Martin Liska <mli...@suse.cz> * lto-symtab.h (enum gcc_plugin_symbol_type): New. * plugin-api.h (struct ld_plugin_symbol): New member symbols_type. (enum ld_plugin_symbol_type): New. (enum ld_plugin_tag): Add new tag LDPT_GET_SYMBOLS_V4. lto-plugin/ChangeLog: 2020-03-09 Martin Liska <mli...@suse.cz> * lto-plugin.c (parse_table_entry): Parse symbol type. --- gcc/lto-streamer-out.c | 2 ++ include/lto-symtab.h | 7 +++++++ include/plugin-api.h | 13 ++++++++++++- lto-plugin/lto-plugin.c | 12 ++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-)