我有以下简短的简单C文件,名为composition.c
:
long inside (long a1,long a2)
{
return a1+a2-a1*a2;
}
long outside(long b1,long b2,long b3,long b4)
{
long first_half = inside(b2,b3);
long second_half = inside(b1,b4);
return(first_half+second_half);
}
int main(int argc, char** argv)
{
long answer=outside(3,4,5,6);
return 0;
}
[在HighSierra MacBook Air的终端上,我执行了gcc -g -O0 composition.c -o composition
和objdump -d composition
,但是后者会产生错误消息:
$ objdump -d composition
composition: file format Mach-O 64-bit x86-64
/Library/Developer/CommandLineTools/usr/bin/objdump: 'composition': truncated or malformed object (bad section index: 3 for symbol at index 2)
所以我问我的C代码有什么问题吗?
来自objdump文档:
- d
- 拆卸
- 拆卸=符号
显示输入文件中机器指令的汇编助记符。这个选项只会反汇编预期包含说明的部分。如果可选给出symbol参数,然后显示汇编助记符从符号开始。如果符号是函数名称,则反汇编将停止在该函数的末尾,否则它将在下一个停止时停止遇到符号。如果没有符号匹配,则无将显示。
尝试使用-D选项:
- d
- 拆卸-所有
类似于-d,但分解所有部分的内容,而不仅仅是那些预期包含说明。
此选项还对拆卸代码部分中的说明。当选项-d有效时objdump将假定代码段中存在的任何符号都出现在指令之间的边界,它将拒绝反汇编这样的边界。当选项-D有效时,此假设被压制。这意味着可以输出-d和-D例如,如果数据存储在代码段中,则有所不同。
因为即使对于-O0,您的代码对于编译器来说也太容易了。