nauczyłem się od tej ostatniej odpowiedzi, że gcc zawiera nazwę pliku źródłowego gdzieś w binarnym jako metadane, nawet podczas debugowania nie jest włączony.
Nie całkiem. W nowoczesnym obiekcie ELF plików nazwę pliku rzeczywiście jest symbolem typu 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
Jednak, gdy pozbawiono, symbol znika:
$ strip bignum.o
$ readelf -all bignum.o | grep bignum.c
$
Tak, aby zachować prywatność, rozebrać wykonywalny, lub skompiluj/połącz z -s
.
To nie tylko GCC, Clang to robi (i każdy kompilator, który tworzy pliki binarne ELF zgodne z [specyfikacją] (http://flint.cs.yale.edu/cs422/doc/ELF_Format.pdf)). – cyphar
@cyphar Przyznaję, że po prostu wpadłem na to zamiast czytać wszystkie 60 stron, ale znalazłem PLIK wspomniany tylko na stronie 25 tego dokumentu i nie mówi on, że jest to obowiązkowe ("Konwencjonalnie, nazwa symbolu podaje nazwę plik źródłowy powiązany z plikiem obiektowym "). –
Nie przeczytałem również wszystkich 60 stron. Ale jeśli chodzi o standardy "konwencjonalnie" oznacza "prawdopodobnie powinieneś to zrobić, ponieważ ludzie mogą na nim polegać". Na koniec dnia, jeśli dostaniesz specyfikację, łatwiej po prostu podążaj za nią (z uwagi na to, że Twoi użytkownicy mogą zdecydować się na użycie najbardziej ezoterycznych funkcji wyrażonych w standardzie) niż próbować i wyplątać się z wyjścia wdrażanie rzeczy, których nie musisz. w końcu GNU jest krainą ekstremalnych ilości dodatkowych funkcji. – cyphar