C代码使用gcc进行静默编译,但是在objdump中引发“截断-格式错误的对象”错误

问题描述 投票:1回答:1

我有以下简短的简单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 compositionobjdump -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代码有什么问题吗?

c x86 x86-64
1个回答
0
投票

来自objdump文档:

- d

- 拆卸

- 拆卸=符号

显示输入文件中机器指令的汇编助记符。这个选项只会反汇编预期包含说明的部分。如果可选给出symbol参数,然后显示汇编助记符从符号开始。如果符号是函数名称,则反汇编将停止在该函数的末尾,否则它将在下一个停止时停止遇到符号。如果没有符号匹配,则无将显示。

尝试使用-D选项:

- d

- 拆卸-所有

类似于-d,但分解所有部分的内容,而不仅仅是那些预期包含说明。

此选项还对拆卸代码部分中的说明。当选项-d有效时objdump将假定代码段中存在的任何符号都出现在指令之间的边界,它将拒绝反汇编这样的边界。当选项-D有效时,此假设被压制。这意味着可以输出-d和-D例如,如果数据存储在代码段中,则有所不同。

因为即使对于-O0,您的代码对于编译器来说也太容易了。

© www.soinside.com 2019 - 2024. All rights reserved.