Сегмент PT_NOTE в файлах ELF имеет фиктивное смещение/адрес.Linux

Ответить
Anonymous
 Сегмент PT_NOTE в файлах ELF имеет фиктивное смещение/адрес.

Сообщение Anonymous »

Я просматриваю кучу двоичных файлов ELF, у которых есть любопытная запись в таблице заголовков (сегментов) программы:
Введите PT_NOTE, p_offset=p_addr=0x254, p_filesz=p_memsz =0x44
Смещение указывает на середину заголовка ELF (где-то в таблице сегментов). Байты, на которые он указывает, не похожи на действительные примечания — это настоящие данные заголовка программы. Числа 0x254/0x44 появляются слишком постоянно, чтобы быть совпадением.
Насколько я вижу, сегменты типа PT_NOTE все равно игнорируются загрузчиком Linux. Похоже, какой-то поставщик инструментальной цепочки решил использовать поля в сегменте типа заметки в качестве рабочего пространства - не для загрузки и/или сопоставления, а для другой интерпретации. Документ ABI не предполагает ничего подобного. В двоичных файлах также есть разделы типа примечаний в другом месте и с совершенно допустимым форматом.
Что здесь за история?РЕДАКТИРОВАТЬ: может быть это все-таки не царапина; по крайней мере, в имеющихся у меня двоичных файлах число 0x44 соответствует общему размеру разделов примечаний в них (ABI-тег 0x20 и идентификатор сборки 0x24). И все же, что со смещением и адресом?
В моих недавно созданных (с помощью GCC) двоичных файлах есть сегмент PT_NOTE размером 0x44, но смещение/адрес соответствует двум смежным нотам. разделы в двоичном формате. Таким образом, это может быть либо старая ошибка компоновщика, которую загрузчик простил и с тех пор исправил, либо какое-то волшебное условие, специфичное для PT_NOTE...

Доказательства в другом месте: Вот readelf -Wl из одного из них:

Код: Выделить всё

Elf file type is DYN (Position-Independent Executable file)
Entry point 0x8a0
There are 11 program headers, starting at offset 64

Program Headers:
Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
PHDR           0x000040 0x0000000000000040 0x0000000000000040 0x000268 0x000268 R   0x8
LOAD           0x000000 0x0000000000000000 0x0000000000000000 0x000ee0 0x000ee0 R E 0x200000
GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0x10
NOTE           0x000254 0x0000000000000254 0x0000000000000254 0x000044 0x000044 R   0x4
GNU_EH_FRAME   0x000cac 0x0000000000000cac 0x0000000000000cac 0x00006c 0x00006c R   0x4
LOAD           0x001d70 0x0000000000201d70 0x0000000000201d70 0x0002a0 0x0002f0 RW  0x200000
GNU_RELRO      0x001d70 0x0000000000201d70 0x0000000000201d70 0x000290 0x000290 R   0x1
DYNAMIC        0x001d80 0x0000000000201d80 0x0000000000201d80 0x0001f0 0x0001f0 RW  0x8
INTERP         0x004000 0x0000000000203000 0x0000000000203000 0x00000d 0x00000d R   0x1
[Requesting program interpreter:  ./ld-2.27.so]
LOAD           0x004000 0x0000000000203000 0x0000000000203000 0x000030 0x000030 RW  0x1000
LOAD           0x005000 0x0000000000204000 0x0000000000204000 0x000148 0x000148 RW  0x1000

Section to Segment mapping:
Segment Sections...
00
01     .dynsym .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame
02
03
04     .eh_frame_hdr
05     .init_array .fini_array .dynamic .got .data .bss
06     .init_array .fini_array .dynamic .got
07     .dynamic
08     .interp
09     .interp .note.ABI-tag
10     .dynstr .gnu.hash .note.gnu.build-id
Обратите внимание, что сегмент 3 находится в середине заголовка файла (отмечается как сегмент 0).

А здесь читается -WS:

Код: Выделить всё

There are 29 section headers, starting at offset 0x2c28:

Section Headers:
[Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
[ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
[ 1] .dynsym           DYNSYM          00000000000002c8 0002c8 0001c8 18   A 26   1  8
[ 2] .gnu.version      VERSYM          0000000000000570 000570 000026 02   A  1   0  2
[ 3] .gnu.version_r    VERNEED         0000000000000598 000598 000030 00   A 26   1  8
[ 4] .rela.dyn         RELA            00000000000005c8 0005c8 000108 18   A  1   0  8
[ 5] .rela.plt         RELA            00000000000006d0 0006d0 0000f0 18  AI  1  17  8
[ 6] .init             PROGBITS        00000000000007c0 0007c0 000017 00  AX  0   0  4
[ 7] .plt              PROGBITS        00000000000007e0 0007e0 0000b0 10  AX  0   0 16
[ 8] .plt.got          PROGBITS        0000000000000890 000890 000008 08  AX  0   0  8
[ 9] .text             PROGBITS        00000000000008a0 0008a0 0003a2 00  AX  0   0 16
[10] .fini             PROGBITS        0000000000000c44 000c44 000009 00  AX  0   0  4
[11] .rodata           PROGBITS        0000000000000c50 000c50 00005b 00   A  0   0  4
[12] .eh_frame_hdr     PROGBITS        0000000000000cac 000cac 00006c 00   A  0   0  4
[13] .eh_frame         PROGBITS        0000000000000d18 000d18 0001c8 00   A  0   0  8
[14] .init_array       INIT_ARRAY      0000000000201d70 001d70 000008 08  WA  0   0  8
[15] .fini_array       FINI_ARRAY      0000000000201d78 001d78 000008 08  WA  0   0  8
[16] .dynamic          DYNAMIC         0000000000201d80 001d80 0001f0 10  WA 26   0  8
[17] .got              PROGBITS        0000000000201f70 001f70 000090 08  WA  0   0  8
[18] .data             PROGBITS        0000000000202000 002000 000010 00  WA  0   0  8
[19] .bss              NOBITS          0000000000202020 002010 000040 00  WA  0   0 32
[20] .comment          PROGBITS        0000000000000000 002010 00002b 01  MS  0   0  1
[21] .symtab           SYMTAB          0000000000000000 002040 0007c8 18     22  43  8
[22] .strtab           STRTAB          0000000000000000 002808 000320 00      0   0  1
[23] .shstrtab         STRTAB          0000000000000000 002b28 0000fe 00      0   0  1
[24] .interp           PROGBITS        0000000000203000 004000 00000d 00   A  0   0  8
[25] .note.ABI-tag     NOTE            0000000000203010 004010 000020 00   A  0   0  8
[26] .dynstr           STRTAB          0000000000204000 005000 0000ef 00   A  0   0  8
[27] .gnu.hash         GNU_HASH        00000000002040f0 0050f0 000030 00   A  1   0  8
[28] .note.gnu.build-id NOTE            0000000000204120 005120 000024 00   A  0   0  8
Key to Flags:
W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
L (link order), O (extra OS processing required), G (group), T (TLS),
C (compressed), x (unknown), o (OS specific), E (exclude),
D (mbind), l (large), p (processor specific)
Обратите внимание на два раздела примечаний в конце.
Сами двоичные файлы можно загрузить в виде вложений в этом выпуске GitHub.>

Подробнее здесь: https://stackoverflow.com/questions/793 ... et-address
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»