Если у вас есть в виду конкретная строка кода C для проверки в выводе машины, как бы вы нашли ее в выводе objdump. Вот пример
if (cond)
foo;
bar();
и я хочу увидеть, была ли панель встроена так, как мне хотелось бы. Или вы бы использовали альтернативный инструмент вместо objdump?





Вы можете запустить objdump, используя опцию -S (например, "objdump -Sd a.out"). Он будет отображать исходный код, смешанный с кодом ассемблера, если исходные файлы, из которых был скомпилирован код, доступны.
В качестве альтернативы вы можете использовать следующий способ:
int main(void) {
int a = 0;
asm("#");
return a;
}
становится
.file "a.c"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $16, %esp
movl $0, -8(%ebp)
#APP
# 3 "a.c" 1
#
# 0 "" 2
#NO_APP
movl -8(%ebp), %eax
addl $16, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.3.2"
.section .note.GNU-stack,"",@progbits
О верно. Хотя я люблю быть многословным. Можно задаться вопросом, используется ли по умолчанию -D или -d. Это делает его абсолютно безопасным: p
Если вы компилируете с помощью gcc, вы можете использовать -S для непосредственного создания файла сборки. Этот файл обычно содержит некоторую полезную информацию, включая имена функций и иногда номера строк для кода (в зависимости от используемых вами параметров компиляции).
Вы также можете использовать -save-temps как для компиляции, так и для создания файла сборки (и других файлов) в качестве побочного продукта.
Ваш отладчик также должен позволять вам видеть исходный код и соответствующую сборку, если вы скомпилировали с отладочными символами. Это опция gcc -g и команда gdb disass.
Вызовы функций обнаруживаются в сборке с помощью общего пролога функций.
С i386 это
55 push %ebp
89 e5 mov %esp, %ebp
...
c9 leave # optional
c3 ret
с amd64 / x86_64 аналогично (только четырехъядерный префикс 48):
55 push %rbp
48 89 e5 mov %rsp,%rbp
..
c9 leaveq # optional
c3 retq
Поэтому, когда вы обнаруживаете это внутри вашего objdump -S bla.o
или же
gcc bla.c -g -fsave-temps -fverbose-asm вывод вашей основной функции
и для бара также бар не встроен. Также, когда у основного есть вызов или прыжок
чтобы запретить это не встроено.
В вашем случае вы можете увидеть, есть ли в баре местные вары, для которых нужно место
локальный стек. Если полоса встроена, настройте стек (например, sub $0x8,%esp)
выполняется сразу после основного пролога, main может получить доступ к этой переменной.
В противном случае это частный бар.
-S подразумевает -d. Вам не нужно указывать и то, и другое. :-П