
Я работал над своими программами на языке 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 для исполняемого файла.