Разделы ELF не отображаются в сегменты, как ожидалось

#compiler-construction #x86-64 #elf

#компилятор-построение #x86-64 #elf

Вопрос:

Я пишу компилятор и только начинаю генерировать исполняемые файлы ELF с нуля. Я создаю .text раздел (хотя у него нет имени, потому что я еще не создаю таблицу строк) и пытаюсь поместить его в PT_LOAD сегмент. Однако readelf не сообщает, что раздел сопоставлен с сегментом, и objdump отказывается дизассемблировать код в .text разделе. Это считывание readelf , с некоторыми битами, опущенными для краткости:

 ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Advanced Micro Devices X86-64
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          64 (bytes into file)
  Start of section headers:          122 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         1
  Size of section headers:           64 (bytes)
  Number of section headers:         2
  Section header string table index: 0

Section Headers:
  [Nr] Name              Type             Address           Offset
       Size              EntSize          Flags  Link  Info  Align
  [ 0] <no-name>         NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] <no-name>         PROGBITS         0000000008048000  00000078
       0000000000000002  0000000000000000  AX       0     0     16
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000078 0x0000000008048000 0x0000000008048000
                 0x0000000000000002 0x0000000000000002  R E    1000
  

При смещении 0x78 я просто выдаю два push ebx s (код 0x53 операции) для тестирования. Вот шестнадцатеричный дамп:

 00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
00000010  02 00 3e 00 01 00 00 00  00 00 00 00 00 00 00 00  |..>.............|
00000020  40 00 00 00 00 00 00 00  7a 00 00 00 00 00 00 00  |@.......z.......|
00000030  00 00 00 00 40 00 38 00  01 00 40 00 02 00 00 00  |....@.8...@.....|
00000040  01 00 00 00 05 00 00 00  78 00 00 00 00 00 00 00  |........x.......|
00000050  00 80 04 08 00 00 00 00  00 80 04 08 00 00 00 00  |................|
00000060  02 00 00 00 00 00 00 00  02 00 00 00 00 00 00 00  |................|
00000070  00 10 00 00 00 00 00 00  53 53 00 00 00 00 00 00  |........SS......|
00000080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000000b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 01 00  |................|
000000c0  00 00 06 00 00 00 00 00  00 00 00 80 04 08 00 00  |................|
000000d0  00 00 78 00 00 00 00 00  00 00 02 00 00 00 00 00  |..x.............|
000000e0  00 00 00 00 00 00 00 00  00 00 10 00 00 00 00 00  |................|
*
000000fa
  

Редактировать: Вопрос — Почему между ними не отображается сопоставление раздела с сегментом и почему не отображается разборка objdump ?

Комментарии:

1. У вас есть вопрос? Вы излагаете кучу фактов, а затем …? Если ваш вопрос «почему readelf не отображает раздел для сопоставления с сегментом, ответ, скорее всего, будет: не создавайте раздел без имени».

2. @EmployedRussian — добавлен вопрос. Итак, требуется ли таблица строк с именами разделов для дизассемблирования objdump и отображения сопоставлений? Я попробую добавить таблицу строк, когда вернусь домой, и посмотрю, поможет ли это, спасибо!

3. @EmployedRussian да — похоже, что для отчета о сопоставлениях по какой-то причине необходима таблица строк. Если вы хотите опубликовать это как ответ, я приму его.

Ответ №1:

Почему раздел для сопоставления сегментов не отображается между двумя

Потому что нет допустимых разделов (насколько readelf я могу судить).

и почему objdump не показывает дизассемблирование?

objdump также использует разделы.

Несмотря на то, что разделы не требуются для исполняемой части ELF жизненного цикла, многие инструменты зависят от наличия разделов. Например, единственный сегмент, который у вас есть в исполняемом файле, содержит как код, так и ELF заголовок, а также заголовок программы. Как правило, вы не хотите разбирать заголовок. Без разделов objdump не знает, с чего начать разборку.

Комментарии:

1. Для уточнения, чтобы раздел был действительным, его поле ‘name’ должно указывать на ненулевую запись в допустимой таблице строк.