2

我正在尝试在 arm debian 机器(树莓派)上链接一个简单的 c 程序,当链接 ogject 文件时,链接器返回主题中的错误。

我的程序很简单

simple.c:

 int main(){
   int a = 2;
   int b = 3;
   int c = a+b;
 }

我用它编译

$>gcc -o simple.obj simple.c

然后将其与

$>ld -o simple.elf simple.obj
ld: simple.obj: access beyond end of merged section (33872)

我不明白为什么...如果我尝试使用它读取 elf 文件,objdump -d它无法反编译该.text部分(它只打印地址、值.word和以 0x 开头的再次值)但二进制数据与我从反编译的simple.obj.

唯一的区别在于二进制数据的加载开始(和后续)地址:elf 文件从 0x8280 开始,目标文件从 0x82a0 开始。

这是什么意思呢?

编辑:

这是 obj 文件的转储:http: //pastebin.com/YZ94kRk4

这是精灵文件的转储:http: //pastebin.com/3C3sWqrC

我尝试使用 -c 选项进行编译,该选项使 gcc 在组装时间后停止(它已经完成了链接部分)但现在我有一个不同的问题:它说我的目标文件中没有 _start 部分......

新的转储是:

simple.obj:http ://pastebin.com/t0TqmgPa

simple.elf:http ://pastebin.com/qD35cnqw

4

2 回答 2

2

您误解了您运行的命令的效果。如果你运行:

$ gcc -o simple.obj simple.c

它已经创建了您要运行的程序,它已经链接。您不需要再次链接它,尤其是ld直接运行,除非您知道自己在做什么。就算它的扩展名是obj也没关系,只是文件名而已,但文件的内容已经是一个完整的Linux程序了。因此,如果您运行:

$ ./simple.obj

它会执行你的代码。

您通常不ld直接调用,而是gcc用作前端进行编译和链接。这是因为gcc负责链接您未链接的重要库,例如启动代码,这就是您第二次尝试导致“无_start节”或类似内容的原因。

于 2013-11-24T13:15:40.777 回答
0

你能打印objdump -d命令的输出吗?

顺便说一句,请注意33872 == 0x8450

我不熟悉 raspberry PI 的内存映射,因此,如果您正在关注有关此的任何教程或有其他资源来帮助我帮助您,那就太好了 :)

于 2013-11-08T22:22:40.440 回答