Я изучаю файл ELF и использую C программу HelloWorld, созданную G CC на x86_64 CentOS 7 в качестве примера для исследования исполняемого файла.
Я могу понять, как называется имя символа находится для каждого символа в исполняемом файле, кроме двух в динамической таблице символов c (.dynsym).
Взять символ "main" в таблице символов (.symtab), например:
$ readelf -s HelloWorld
...
Symbol table '.symtab' contains 84 entries:
Num: Value Size Type Bind Vis Ndx Name
...
80: 0000000000400586 21 FUNC GLOBAL DEFAULT 13 main
...
Его первоначальное значение:
Name of this symbol
^^ ^^ ^^ ^^
00001e20 00 00 00 00 00 00 00 00 fb 03 00 00 12 00 0d 00 |................|
00001e30 86 05 40 00 00 00 00 00 15 00 00 00 00 00 00 00 |..@.............|
Значение 0x0000 03fb (маленький edian). Это на самом деле смещение в секции .strtab со следующим содержанием:
$ readelf -p .strtab HelloWorld
String dump of section '.strtab':
...
[ 3fb] main
...
Так что легко понять, что имя этого символа "main". И каждый символ, который находится в .symtab или .dynsym и имеет имя, следует этому правилу, кроме двух в .dynsym. Два исключения:
$ readelf -s HelloWorld
Symbol table '.dynsym' contains 6 entries:
Num: Value Size Type Bind Vis Ndx Name
...
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
...
Возьмите символ # 2, например, его первоначальное значение:
Name of the symbol
^^ ^^ ^^ ^^
000002e0 00 00 00 00 00 00 00 00 0b 00 00 00 12 00 00 00 |................|
000002f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
Смещение имени символа 0x0000 000b. Посмотрев на .dynstr:
$ readelf -p .dynstr HelloWorld
String dump of section '.dynstr':
[ 1] libc.so.6
[ b] puts
[ 10] __libc_start_main
[ 22] GLIBC_2.2.5
[ 2e] _ITM_deregisterTMCloneTable
[ 4a] __gmon_start__
[ 59] _ITM_registerTMCloneTable
, я вижу, что строка со смещением 0xb является "путами". Но почему символ "@" добавляется readelf? И почему также добавляется строка "GLIBC_2.2.5" (со смещением 0x22)?