当前位置: 首页 > 面试题库 >

有没有办法让gcc输出原始二进制文件?

陶博涉
2023-03-14
问题内容

是否有一组命令行选项可以说服gcc从自包含的源文件生成平面二进制文件?例如,假设foo.c的内容是

static int f(int x)
{
  int y = x*x;
  return y+2;
}

没有外部引用,没有要导出到链接器的内容。我想获得一个仅带此功能机器说明的小文件,而无需任何其他装饰。有点像(DOS).COM文件,但32位保护模式除外。


问题答案:

试试看:

$ cc -c test.c
$ objcopy -O binary test.o binfile

您可以使用来确保它是正确的objdump

$ objdump -d test.o 
test.o:     file format pe-i386


Disassembly of section .text:

00000000 <_f>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 04                sub    $0x4,%esp
   6:   8b 45 08                mov    0x8(%ebp),%eax
   9:   0f af 45 08             imul   0x8(%ebp),%eax
   d:   89 45 fc                mov    %eax,-0x4(%ebp)
  10:   8b 45 fc                mov    -0x4(%ebp),%eax
  13:   83 c0 02                add    $0x2,%eax
  16:   c9                      leave  
  17:   c3                      ret

并与二进制文件进行比较:

$ hexdump -C binfile 
00000000  55 89 e5 83 ec 04 8b 45  08 0f af 45 08 89 45 fc  |U......E...E..E.|
00000010  8b 45 fc 83 c0 02 c9 c3                           |.E......|
00000018


 类似资料:
  • 问题内容: 众所周知,Java总是在创建时初始化数组。即总是返回一个所有元素= 0的数组。我知道这对于对象数组是必须的,但是对于原始数组(可能是布尔型),在大多数情况下,我们并不关心初始值。 有人知道避免这种初始化的方法吗? 问题答案: 我已经做了一些调查。没有合法的方法在Java中创建未初始化的数组。甚至JNI NewXxxArray也会创建初始化的数组。因此,不可能确切知道数组清零的成本。尽管

  • 问题内容: 我在实现Runnable的类中的run()中调用的方法被设计为引发异常。 但是Java编译器不允许我这样做,建议我用try / catch包围它。 问题是,通过用try / catch包围它,我使 特定的 run()无效了。我 确实 想抛出该异常。 如果我指定的run()的本身,编译器会抱怨说。 通常,我对run()不会抛出异常完全满意 。但是,在我必须具有该功能的特殊情况下。 如何解

  • 所以我正在做一个需要xml模式的小项目,我对这个模式很不熟悉。 我希望能够设置模式以在两组属性之间进行选择,根据我的研究,这在XSD 1.0中是不可能的,但显然是XSD 1.1的一个特性。 目前我正在使用VisualStudio来完成我的工作,它似乎被困在XSD1.0模式中,这是有意义的,因为XSD1.1显然是一个最新的开发。 我的问题是,是否有一个插件/扩展可以让我在Visual Studio中

  • 问题内容: 我想做的是将我的代码发送到远程服务器,该服务器可能安装了不同的python版本和/或可能没有我的应用程序所需的软件包。 现在,要实现这种可移植性,我必须使用解释器和代码来构建可重定位的virtualenv。这种方法存在一些问题(例如,由于无法按预期工作,您必须手动将一堆库复制到virtualenv中),并且通常速度较慢。 从理论上讲,有一种方法可以静态地自行构建python。 我想知道

  • 问题内容: 我正在尝试使用Swift(不是Xcode项目)编写脚本。需要明确的是,我文件的第一行是 我只是从命令行调用它。 但是,我无法弄清楚该脚本如何使用另一个.swift文件中的代码。它不会从同一目录中拾取它,而且我看不到任何方法。 支持吗? 问题答案: 有更好的方法! 如果您要从中导入文件,将像:

  • 问题内容: 当然,在Java中。我正在编写程序并在Windows环境下运行它,但是我需要以Unix格式完成输出(.csv)。任何简单的解决方案?谢谢! 问题答案: 注意:如评论中所述,下面给出的方法在JDK 9+中是无效的。 使用James H.的答案中的方法。 “ Unix格式”是指使用“ \ n”作为行终止符而不是“ \ r \ n”吗?在创建PrintWriter之前,只需设置系统属性即可。