Linker ld:超出合并节末尾的访问权限

Linker ld:超出合并节末尾的访问权限,linker,arm,linker-errors,ld,elf,Linker,Arm,Linker Errors,Ld,Elf,我试图在arm debian机器(raspberry pi)上链接一个简单的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 beyo

我试图在arm debian机器(raspberry pi)上链接一个简单的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)
我不明白为什么。。。 如果我尝试用
objdump-d
读取elf文件,它无法反编译
.text
部分(它只打印地址、值、
.word
和前面加0x的值),但二进制数据与我从反编译的
simple.obj
中获得的数据相同

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

这一切意味着什么

编辑:

这是obj文件的转储:

这是elf文件的转储:

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

新转储为:

simple.obj:


simple.elf:

能否打印
objdump-d
命令的输出

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


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

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

$gcc-o simple.obj simple.c

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

$。/simple.obj

它将执行您的代码


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

mmmm这很有趣,因此,如果我需要使用不同的ld脚本来生成可执行文件,最好让gcc使用它,而不是在链接之前停止它,然后使用ld?是的,您可以使用
-T script
选项和
gcc
来指定链接器脚本()。