che ho imparato da questa recente risposta che gcc include il nome del file di origine da qualche parte nel binario come metadati, anche quando debug non è attivo.
Non proprio. Nella moderna oggetto ELF file il nome del file in effetti è un simbolo di tipo FILE
:
$ readelf bignum.o # Source bignum.c
[...]
Symbol table (.symtab) contains 36 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 FILE LOCAL DEFAULT ABS bignum.c
2: 0000000000000000 0 SECTION LOCAL DEFAULT 1
3: 0000000000000000 0 SECTION LOCAL DEFAULT 3
4: 0000000000000000 0 SECTION LOCAL DEFAULT 4
5: 0000000000000000 0 SECTION LOCAL DEFAULT 5
6: 0000000000000000 0 SECTION LOCAL DEFAULT 6
7: 0000000000000000 0 SECTION LOCAL DEFAULT 7
8: 0000000000000000 0 SECTION LOCAL DEFAULT 8
9: 00000000000003f0 172 FUNC GLOBAL DEFAULT 1 add
10: 00000000000004a0 104 FUNC GLOBAL DEFAULT 1 copy
Tuttavia, una volta messo a nudo, il simbolo è andato:
$ strip bignum.o
$ readelf -all bignum.o | grep bignum.c
$
Quindi, per mantenere la vostra privacy, spellare l'eseguibile, o compilare/collegare con -s
.
Non è solo GCC, Clang lo fa (e qualsiasi toolchain del compilatore che crea binari ELF che seguono la [specifica] (http://flint.cs.yale.edu/cs422/doc/ELF_Format.pdf)). – cyphar
@cyphar Devo ammettere che mi sono semplicemente immerso in esso anziché leggere tutte le 60 pagine, ma ho trovato FILE menzionato solo a pagina 25 di quel documento, e non dice che è obbligatorio ("Convenzionalmente, il nome del simbolo dà il nome di il file sorgente associato al file oggetto "). –
Non ho letto neanche tutte le 60 pagine. Ma quando si tratta di standard "convenzionalmente" significa "probabilmente dovresti farlo perché la gente potrebbe fare affidamento su di esso". Alla fine della giornata, se ti viene data una specifica è più facile seguirla alla lettera (dato che i tuoi utenti potrebbero decidere di utilizzare le caratteristiche più esoteriche espresse nello standard) piuttosto che provare a uscire furtivamente da implementando cose che non devi. dopotutto GNU è la terra di quantità estreme di funzionalità extra. – cyphar