【发布时间】:2017-07-21 07:51:58
【问题描述】:
我正在学习编译过程,我知道链接主要用于将包含“主”函数的二进制文件与其他包含在我们的主函数中使用的其他辅助函数的二进制文件链接。
但是,当我尝试使用代码运行目标文件时:
int main() {
return 0;
}
在 Ubuntu 上使用 gcc 中的 -c 命令编译,我尝试运行它,但出现错误:
“bash: ./source.o: 无法执行二进制文件:执行格式错误”
【问题讨论】:
-
对象文件不能直接执行。
-
你需要标准函数的链接,比如
printf,等等。并且即使你不使用它们,你也需要一个入口点,启动代码来初始化堆、栈... -
好吧,操作系统告诉你它没有将文件格式识别为可执行文件。这就是为什么!
-
@Jean-FrançoisFabre 这当然不是问题所在。您可以编写一个不与外部通信的程序。它没有实际用途的事实与我提出的问题完全无关。
-
@yoyo_fun:
man execl会给你一个很好的概览,了解在调用main之前发生的事情(以及在main返回之后发生的事情)。execl至关重要,因为根据 Posix,一旦 shell 确定要运行哪个可执行映像,“shell 将在单独的实用程序环境中执行实用程序……其操作相当于调用 execl() 函数…… . 将路径参数设置为搜索结果的路径名,arg0 设置为命令名称,其余 execl() 参数设置为命令参数(如果有)和空终止符。"
标签: c++ c ubuntu gcc compilation