Исходный код C:
static int b;
Соответствующий код дизассемблирования раздела .bss в объектном файле:
Disassembly of section .bss:
00000000 <b>:
0: 00 00 add %al,(%eax)
2: 00 00 add %al,(%eax)
Исходя из информации заголовка раздела:
3 .bss 00000004 00000000 00000000 00000068 2**2
ALLOC
Очевидно, что .bss существует и занимает определенное место (совпадает с шестнадцатеричным дампом)!
Я хочу спросить две вещи,
1.Когда я использую readelf для сброса раздела .bss:
readelf -x .bss section_test.o
Section '.bss' has no data to dump.
Я просто не понимаю. В нем определенно есть какие-то данные, не так ли?
2. Как понять этот код в разделе .bss? Я имею в виду, что я полностью понимаю их по отдельности как сборку, но я просто немного смущен тем, почему они здесь?
Спасибо.
Дополнительная информация: MacOS с использованием Docker (Ubuntu), синтаксисом AT&T, x86_64 Arch (физический), но с использованием архива elf_i386 (32-bit) на этапе компиляции и компоновки.
bss
есть размер, но нет данных. Это раздел для данных, инициализированных нулями, которые можно не указывать в двоичном изображении.objdump
, вероятно, просто показывает нули, которые будут сгенерированы в ОЗУ при загрузке двоичного файла. - person fuz   schedule 23.11.201900 00
- это код операции дляadd %al, (%eax)
. Содержимое.bss
не предназначено для выполнения. Это просто память для переменнойb
. - person fuz   schedule 23.11.2019