Функциональные вызовы обнаруживаются в сборке с помощью пролога общей функции.
С 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 может получить доступ к этому var. Если нет, то это запрещено.
-S означает -d. Вам не нужно указывать оба. :-P – 2008-11-12 03:43:45
О, право. Мне нравится быть многословным. Можно задаться вопросом, является ли значение -D или -d значением по умолчанию. Это делает его безопасным с мертвой точки: p – 2008-11-12 03:48:27