Давайте скомпилируем вашу программу с gcc -O0 program.c -o program
, затем разберем ее с objdump -D program
. Для удобства я пошел дальше и сделал это ( AT & T синтаксис , Intel синтаксис ). Вы можете видеть, что foo
находится в разделе .text
, и он был заменен заглушкой, которая по сути ничего не делает и просто выходит из функции. Поскольку point
было определено после объявления, оно эквивалентно определению прямо в объявлении, а также находится в разделе .text
с фактической реализацией. Вы можете видеть, что вы правы, что data1
находится в .bss
и что data2
находится в .data
. Что касается массива {'a', 'b', 'c'}
в main, вы можете видеть, что он немного странный.
6c1: c6 45 f5 61 mov BYTE PTR [rbp-0xb],0x61
6c5: c6 45 f6 62 mov BYTE PTR [rbp-0xa],0x62
6c9: c6 45 f7 63 mov BYTE PTR [rbp-0x9],0x63
Значения фактически загружаются одно за другим в массив, поэтому я думаю, вы могли бы сказать, что он хранится в разделе .text
. Вы можете заметить, что строка "word"
на самом деле не находится в разборке. Однако, если вы сделаете readelf -x .rodata program
, вы найдете его в разделе .rodata
.
Hex dump of section '.rodata':
0x000007d0 01000200 776f7264 00256c64 0a00 ....word.%ld..
Вы также можете видеть, что, хотя переменные не указаны по имени, они расположены на стековый фрейм функции , заданный смещением базового указателя rbp
. Для 64-разрядных двоичных файлов адрес составляет 8 байтов, а для 32-разрядных двоичных файлов адрес составляет 4 байта.