Почему readelf добавляет "@ GLIBC_2.2.5 (2)" после имен символов FUN C в таблице символов .dynsym - PullRequest
1 голос
/ 15 января 2020

Я изучаю файл 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)?

1 Ответ

1 голос
/ 15 января 2020

Но почему символ "@" добавляется readelf? И почему также добавляется строка «GLIBC_2.2.5» (со смещением 0x22)?

Это символы с версией GNU. readelf добавляет эту информацию, чтобы прояснить ее, в противном случае вы увидите, например, это:

  1232: 00000000000792d0   471 FUNC    GLOBAL DEFAULT   13 fmemopen
  1233: 0000000000078ed0   527 FUNC    GLOBAL DEFAULT   13 fmemopen

и будете смущены тем, как может быть два отдельных fmemopen с по разным адресам.

Текущий вывод:

  1232: 00000000000792d0   471 FUNC    GLOBAL DEFAULT   13 fmemopen@GLIBC_2.2.5
  1233: 0000000000078ed0   527 FUNC    GLOBAL DEFAULT   13 fmemopen@@GLIBC_2.22

показывает, что к этим символам прикреплена различная информация о версии, и что версия GLIBC_2.22 является версией по умолчанию.

Подробнее о Версионные символы GNU здесь .

...