Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何从汇编程序源代码中以与clang-cmain.c相同的方式生成对象文件_Assembly_Gnu Assembler - Fatal编程技术网

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 Binutils
as
不会生成链接的可执行文件。

(不带
-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
...