Части заголовка файла

Части заголовка файла

Я работал над своими программами на языке C, я новичок в разработке Linux/UNIX и хотел осмотреться.

Я создал простую программу Hello world на языке C и проверял процесс компиляции.

Я попытался прочитать заголовок файла конечного исполняемого файла и получил такой вывод

$ objdump -f my_output
file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048320**

Я понимаю часть elf32-i386, но не совсем уверен в других частях заголовка.

как-то связано D_PAGEDс подкачкой по запросу? и что это EXEC_P, HAS_SYSMSзначит? начальный адрес - это логический адрес main()программы?

решение1

Флаги в выводе:BFD — дескрипторы двоичных файлов. Они являются частью пакета binutils, вы можете прочитать, что означают флаги, если посмотрите /usr/include/bfd.hих значение в заголовочном файле bfd илиздесь.

Ссылка на «флаги»0x00000112это то, что называетсяполе флага. Он двоичный, и каждый бит представляет определенную функцию, единица означает, что флаг включен или установлен, а ноль означает, что он не включен. Также обратите внимание, что "0x..." означает, что это шестнадцатеричное значение, поэтому, если вы преобразуете его из HEX в BIN:

0x00000112 = 0001 0001 0010 в двоичном формате.

Итак, устанавливаются флаги, соответствующие 2-му, 5-му и 9-му битам в поле флага. Это флаги, которые отображаются по имени в 3-й строке вывода команды objdump.

Значение флагов

3 флага, которые есть у вашего исполняемого файла, довольно стандартны. Читайте биты справа налево!

1-й бит - 0000 0000 0010

  /* BFD is directly executable.  */
#define EXEC_P         0x02

2-й бит - 0000 0001 0000

  /* BFD has symbols.  */
#define HAS_SYMS       0x10

3-й бит - 0001 0000 0000

  /* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
     linker sets this by default, but clears it for -r or -n or -N).  */
#define D_PAGED        0x100

Итак, выводы:

  • Это исполняемый файл
  • он включает в себя таблицу символов, если вы хотите отладить его с помощью Gnu Debugger, gdbпоэтому функции будут иметь осмысленные имена
  • исполняемый файл динамически связан со стандартными библиотеками, такими как glibc и т. д.

Начальный адрес

Последняя строка, начальный адрес ..., как вы уже догадались, — это место, где начинается фактический .CODE для исполняемого файла.

Связанный контент