Assembly 如何从汇编程序源代码中以与clang-cmain.c相同的方式生成对象文件
我想研究一个Assembly 如何从汇编程序源代码中以与clang-cmain.c相同的方式生成对象文件,assembly,gnu-assembler,Assembly,Gnu Assembler,我想研究一个obj文件的细节,我已经生成了一个main.S文件,当我使用作为main.S时,我得到了一个a.out文件作为回报,该文件可以直接使用/a.out运行,并且ld-melf\u x86\u 64 a.out会产生错误 我想生成一个对象文件,其文件类型与clang-cmain.c的结果相同。 我该怎么做 我可能把操作弄错了,导致了错误的解释由于不生成可执行文件,可执行文件是叮当声的结果。感谢所有回答者,很抱歉造成混乱,并浪费了您的时间。最简单的方法,使用集成为-c main.c的cla
obj
文件的细节,我已经生成了一个main.S
文件,当我使用作为main.S
时,我得到了一个a.out
文件作为回报,该文件可以直接使用/a.out
运行,并且ld-melf\u x86\u 64 a.out
会产生错误
我想生成一个对象文件,其文件类型与clang-cmain.c
的结果相同。
我该怎么做
我可能把操作弄错了,导致了错误的解释
由于
不生成可执行文件,可执行文件是叮当声的结果。感谢所有回答者,很抱歉造成混乱,并浪费了您的时间。最简单的方法,使用集成为-c main.c的clang-v-fno,并从其输出中获取gas命令行。as-o foo.o foo.s
如果您有一个.S
,通常意味着您希望在组装之前通过C预处理器运行它。gcc
和clang
前端将为您实现这一点:gcc-cfoo.S
(默认输出文件名foo.o,而不是a.out)。但是,如果您的.S
实际上没有任何CPP指令,如\If
或\define
,您可以将其与组合为
a.out
是as
输出的默认名称,但它是一个对象文件,就像您从gcc-c foo.s
获得的一样,不是链接的可执行文件GNU Binutilsas
不会生成链接的可执行文件。
(不带-c
的ld foo.o
或gcc
/clang
的默认输出文件名也是a.out,但不要被名称愚弄。)
您可以使用gcc-v-cfoo.s
将显示为它使用的
命令行,包括-o
选项。(clang有一个内置的汇编程序,因此它不会运行单独的as
命令,但是gcc
前端确实只运行as
来汇编asm源文件。如果没有-c
,则运行ld
(通过collect2)将目标文件链接到可执行文件。)
e、 g.在我的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 +++
你做了什么来组装对象文件?您可以执行cc-cmain.S
来获取这样一个对象文件。或者使用clang
或任何其他编译器而不是cc
。我正在尝试处理中间结果,以查看学习反向工程的最终结果。@Riu您的问题的措辞正确:“我想生成一个文件类型与clang-c main.c的结果相同的目标文件”。您试图将生成的对象文件与ld
链接,因此您似乎没有误解可执行构建过程中的preproc/asm/COFF/链接阶段^^^@Riu我建议您用更准确的措辞重新表述您的问题标题,如“我怎样才能像clang-cmain.c那样从汇编程序源代码生成一个对象文件“谢谢@zilog80,我已经更改了它。我假设它是一个链接文件,因为结果文件a.out
可以使用/a.out
@Rui运行。正如我演示的,在我的Arch GNU/Linux系统上,情况并非如此。它没有exec权限,是ELF“可重定位”而不是“可执行”或“共享对象”/“饼图可执行”。即使我对它进行了chmod,在尝试运行它时也会出现Exec format error
。您使用的是哪种系统?我在文件a.out
中也看到了可重新定位的
,但在我的情况下,它是可运行的。我在ubuntu。是因为格式可重定位和可执行文件非常接近,有时可重定位也可以运行吗?哦,你完全正确,我把结果搞混了!!!!我很抱歉<代码>as
不生成可执行文件!!!请注意,OP的文件名为main.s
,因此预处理器可能需要运行。它显示了clang的命令行,我看不到以开头的命令行作为@Rui:这只适用于gcc-v-cfoo.s
(或foo.c>),而不是clang。clang有一个内置的汇编程序,因此它不需要在其上运行as
。如果您有llvm clang,您可以告诉它不要使用它的integrated as with-fno integrated as
。默认情况下,LLVM使用其适当的集成汇编程序。@PeterCordes,因为它已经在其他Q&A中介绍过,-LLVM当时只是答案中的噪音。一个好的解决方案<代码>无集成,因为
在提供的众多选项中有点难找到。
$ 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
...