gpt4 book ai didi

c++ - 当我们在没有链接的情况下编译包含 'main'的源代码时,为什么不能运行呢?

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:57 24 4
gpt4 key购买 nike

我正在学习编译过程,我知道链接主要用于将包含“主”函数的二进制文件与包含我们主函数中使用的其他辅助函数的其他二进制文件链接起来。

但是,当我尝试使用以下代码运行目标文件时:

int main() {
return 0;
}

在 Ubuntu 上使用 gcc 中的 -c 命令编译,我尝试运行它但出现错误:

"bash: ./source.o: cannot execute binary file: Exec format error"

最佳答案

阅读 Levine 的 Linkers & Loaders .

了解 ELF .

尝试使用 gcc -v 进行编译(您将看到实际使用的程序是什么:cc1compile C 代码到某个汇编器中,as assemble 到某个目标文件,ld & collect2link )。另请使用 gcc -S -fverbose-asm -O 查看生成的汇编程序文件。请注意,gcc 知道(并特别地编译)main 函数。你的可执行文件的起点由一些 crt0 提供。等(它不是不是main而是一些_start例程编码在汇编器中调用你的main.... ).

Object filesexecutables 不同.可执行文件包含类似 crt0 的内容和 C standard library , 或者某种方式到 dynamically link它作为 shared object (并且您需要链接您的 source.o - 从 source.c 中的空 main 编译 - 因此成为可执行文件)。

在 Linux 上,使用 objdump(1) & readelf(1) (在一些现有的二进制文件上,以及在您的 source.o 目标文件上)

另见 elf(5) , execve(2) , ld-linux(8) , Linux assembly howto , syscalls(2) , Advanced Linux Programming , Operating Systems: Three Easy Pieces , 和(了解 libc.so)Drepper 的 How To Write Shared Libraries , Dragon Book ...

(你需要阅读整本书才能理解细节;我给出了一些引用)

另请查看 Common Lisp & SBCL .它的编译器有一个非常不同的模型(真的不同于 C)。

关于c++ - 当我们在没有链接的情况下编译包含 'main'的源代码时,为什么不能运行呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42541002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com