当前位置: 首页 > 知识库问答 >
问题:

如何从汇编程序源以与clang-c main相同的方式生成对象文件。c是的

黎奇思
2023-03-14

我想研究一个obj文件的细节,我已经制作了一个main。S 文件,当我用作主文件时。S 我得到一个 a.out 文件作为回报,该文件可以直接使用 ./a.outld -m elf_x86_64 a.out 会产生错误。

我想生成一个对象文件,其文件类型与clang-cmain.c的结果相同。我该怎么做?

我可能混淆了操作,导致错误的解释。由于不生成可执行文件,因此可执行文件是 CLANG 的结果。感谢所有回答者,很抱歉造成混乱,浪费了您的时间。

共有2个答案

史朗
2023-03-14

最简单的方法,使用< code > clang-v-fno-integrated-as-c main . c 并从其输出中获取gas命令行。

百里海超
2023-03-14

作为 -o foo.o foo.s

如果您有 .S,通常这意味着您希望在组装之前通过 C 预处理器运行它。gccclang 前端将为您做到这一点:gcc -c foo。S(默认输出文件名 foo.o,而不是 a.out)。如果您的 .S 实际上没有任何像 #if#define 这样的 CPP 指令,但是,您可以使用 as 组装它。

a.out作为输出的默认名称,但它是一个目标文件,就像您从gcc-c foo. s中获得的一样,而不是链接的可执行文件!GNU Binutilsas不生成链接的可执行文件。

(不带 -cld foo.ogcc / clang 的默认输出文件名也是 a.out,但不要被这个名字所迷惑。

您可以使用 gcc -v -c foo.s 来显示它使用的 as 命令行,包括 -o 选项。(Clang 有一个内置的汇编程序,所以它不会运行单独的 as 命令,但 GCC 前端确实只是运行以组装 ASM 源文件。如果没有 -c,则运行 ld(通过 collect2)将目标文件链接到可执行文件中。

例如,在我的x86-64 GNU/Linux系统上:

$ cat > foo.s
mov $231, %eax             # __NR_exit_group
syscall
$ as foo.s
$ file a.out
a.out: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
$ ld a.out -o exit
ld: warning: cannot find entry symbol _start; defaulting to 0000000000401000
$ ls -l exit a.out 
-rw-r--r-- 1 peter peter  664 Mar 22 08:23 a.out
-rwxr-xr-x 1 peter peter 4632 Mar 22 08:23 exit
$ file exit
exit: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped

$ ./a.out
bash: ./a.out: Permission denied
$ ./exit
$ strace ./exit 
execve("./exit", ["./exit"], 0x7ffc72823fc0 /* 55 vars */) = 0
exit_group(0)                           = ?
+++ exited with 0 +++
$ as --version
GNU assembler (GNU Binutils) 2.35.1
...
This assembler was configured for a target of `x86_64-pc-linux-gnu'.
$ ld --version
GNU ld (GNU Binutils) 2.35.1
...
 类似资料:
  • 问题内容: 我想为Java的玩具语言编写一个编译器。我想生成可运行的.class文件。我想知道执行此操作的最佳库或工具是什么?我知道我可以学习所有指令的二进制格式并建立自己的常量池等,但这似乎应该已经完成​​:没必要重新发明轮子,对吗? 在线搜索我发现了两种不同的Java汇编语言Jasmin和Jamaica,但是只有Jasmin看起来有所维护。 是否存在用于将字节码写入流的Java库?这是Apac

  • 问题内容: 如何做到这一点? 如果我想分析某些东西是如何编译的,我将如何获取发出的汇编代码? 问题答案: 使用该选项来gcc(或g ++)。 这将在helloworld.c上运行预处理器(cpp),执行初始编译,然后在运行汇编器之前停止。 默认情况下,这将输出一个文件。仍可以使用该选项设置输出文件。 当然,这只有在您拥有原始来源的情况下才有效。如果仅具有结果对象文件,则可以通过设置选项(或-d缩写

  • JDBC教程建议使用对象来获得数据库连接,而不是使用类。要引用“连接数据源对象”页面,请执行以下操作: 获取数据源连接的首选方式。 如何为到Postgres的JDBC连接获取这样的对象?我有一个JDBC驱动程序。 现在,我不想像这样摆弄JNDI。 我可以在我的Java应用程序中以编程方式实例化吗?或者我必须自己实现那个接口?

  • 我已经从容器A复制了一个文件1.txt到容器b。 我还能够获得复制文件的完整URL,并能够在相同的浏览器选项卡中打开它,只要容器是公共的。 现在我正在使我的容器私有..我希望有一个简单的API可以给我SAS URL 有没有这样的API?

  • 问题内容: 有没有人使用基于Java的库来生成excel文档?最好支持2003年? 问题答案: 我目前正在使用非常全面的Apache POI(http://poi.apache.org/index.html)。2003文件格式版本仍处于beta版本,但似乎运行良好。我并没有很好地利用它的功能,只是对Excel进行简单的读写,但这似乎是可靠的。

  • 注意:我知道我可以通过导航到/{documentname}/swagger.json来访问和查看swagger文档,但这不允许我更改它