Vorrei rimuovere tutti i simboli non utilizzati dal mio binario compilato C++. Ho visto questo, che fornisce una panoramica usando gcc, che è la toolchain che sto usando: How to remove unused C/C++ symbols with GCC and ld?opzione linker per ignorare le dipendenze non utilizzate
Tuttavia, sul mio sistema, l'opzione di collegamento (-Wl,--gc-sections
) viene rifiutata:
$ gcc -fdata-sections -ffunction-sections a.c -o a.o -Wl,--gc-sections
ld: fatal: unrecognized option '--'
ld: fatal: use the -z help option for usage information
collect2: error: ld returned 1 exit status
Sono in esecuzione su illumos, che è un fork relativamente recente di Solaris, con GCC 4.7. Qualcuno sa qual è l'opzione linker corretta da usare qui?
Modifica: cercare le pagine man più da vicino alzato "-zignore":
-z ignore | record
Ignores, or records, dynamic dependencies that are not
referenced as part of the link-edit. Ignores, or
records, unreferenced ELF sections from the relocatable
objects that are read as part of the link-edit. By
default, -z record is in effect.
If an ELF section is ignored, the section is eliminated
from the output file being generated. A section is
ignored when three conditions are true. The eliminated
section must contribute to an allocatable segment. The
eliminated section must provide no global symbols. No
other section from any object that contributes to the
link-edit, must reference an eliminated section.
Tuttavia la seguente sequenza mette ancora FUNCTION_SHOULD_BE_REMOVED
nella sezione ELF .text.FUNCTION
:
$ cat a.c
int main() {
return 0;
}
$ cat b.c
int FUNCTION_SHOULD_BE_REMOVED() {
return 0;
}
$ gcc -fdata-sections -ffunction-sections -c a.c -Wl,-zignore
$ gcc -fdata-sections -ffunction-sections -c b.c -Wl,-zignore
$ gcc -fdata-sections -ffunction-sections a.o b.o -Wl,-zignore
$ elfdump -s a.out # I removed a lot of output for brevity
Symbol Table Section: .dynsym
[2] 0x08050e72 0x0000000a FUNC GLOB D 1 .text.FUNCTION FUNCTION_SHOULD_BE_REMOVED
Symbol Table Section: .symtab
[71] 0x08050e72 0x0000000a FUNC GLOB D 0 .text.FUNCTION FUNCTION_SHOULD_BE_REMOVED
Perché le pagine man dicono "nessun simbolo globale", ho provato a rendere la funzione "statica" e con lo stesso risultato finale.
ld versione 2.23.52.0.1 (2013, CentOS 7.0) does't supporto '-z ignore' purtroppo. –