写bootloader的LDS脚本编译出错,求大神帮忙

MostHandsomeWang 学生  2015-10-02 07:23:22
[root@onlyYou 1002]# make
arm-linux-gcc -g -c Start.S
arm-linux-ld -THandsomeWangBoot.lds -o HandsomeWangBoot.elf Start.o
arm-linux-ld:HandsomeWangBoot.lds:4: syntax error
make: *** [all]

以上是错误
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS{
.=0x00000000;
.=ALIGN(4);
.text :
{
Start.o(.text)
*(.text)
}
.=ALIGN(4);
.data :
{
*(.data)
}
.=ALIGN(4);
bss_start = .;
.bss :
{
*(.bss)
}
bss_end = .;
}

上面是我的脚本文件
all : Start.o
arm-linux-ld -THandsomeWangBoot.lds -o HandsomeWangBoot.elf $^
arm-linux-objcopy -O binary HandsomeWangBoot.elf HandsomeWangBoot.bin

%.o : %.S
arm-linux-gcc -g -c $^

%.o : %.c
arm-linux-gcc -g -c $^

.PHONY: clean
clean:
rm *.o *.elf *.bin

这个上面是我的makefile

求大神给看看哪里不对啊
...全文
192 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
MostHandsomeWang 2015-10-08
引用 1 楼 qinbaoru 的回复:
arm-linux-ld:HandsomeWangBoot.lds:4: syntax error 这个已经提示你链接脚本第4行语言有错,一般经验要不是就第4行有问题,要不就是4行的上下有问题, 也就是第3或者第5行有问题,反正其中的一行有问题,因为他只有一个报错。 SECTIONS { .text : { *(.text) } . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .sdata : { *(.sdata) } _gp = ALIGN(16); __got_start = .; .got : { *(.got) } __got_end = .; .sdata : { *(.sdata) } . = ALIGN(4); __bss_start = .; .sbss : { *(.sbss) } .bss : { *(.bss) } _end = .; } 看了这个例子(随便从内核CP的一个.lds文档)别急往下看,应该能找到问题了吧。我可要说结果了: 你的应该改成: OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS{ .=0x00000000; /*.=ALIGN(4);*/ //把这个去掉或者注释掉.哥子,记得给分哦,呵呵。我可找了蛮久,这种细心的问题有时真得花时间的. .text : { Start.o(.text) *(.text) } .=ALIGN(4); .data : { *(.data) } .=ALIGN(4); bss_start = .; .bss : { *(.bss) } bss_end = .; }
谢谢你了!!!不过问题是空格导致的。。。。。它对空格有严格的语法要求
回复
也许我的回答也不一定正确,因为没法调试,所以我也没确定。这是因为没确定,我又反复了看了你拉代码,提出几个检查的方向: 1)Makefile按理说这个没问题的,但是有时,网络这种东西,任何编译器都不是完美的,所以,也检查一下. a.在执行指令是是否以[TAB]开头了。 b.你的arm-linux-gcc -g -c $^/*由于隐性规则可以省去-o %.o文件 -g 是产生调试和排错的信息,可以用GUN的GDB进行调试,当然 也没问题,但是现在不是出错了嘛,还是要-g了,老老实实的写一下*/ Start.o:Start.S arm-linux-gcc -c -o Start.o Start.S 2)XXX.lds a.检查一下你的起始地址,一般光写个裸板程序,应该是0x00000000本应该没问题的,但是它现在报错了,你也得仔细检查一下你 起始地址了。 b.把所有的ALIGN(4)都去掉一下. c.要不给你的.... .....(前面省略) SECTIONS { .=0x00000000; .text: { /xxx/xxx/start.o (.text) /* 添加一下,你在make时相对Start.o的路径,如果在Start.o就是make的当前路径下,那么就不用修改这里了,我也只是提议一下. */ (*.text) } ........不改动的后面的省略. } 希望 以上的建议能助你能排查出错误!
回复
arm-linux-ld:HandsomeWangBoot.lds:4: syntax error 这个已经提示你链接脚本第4行语言有错,一般经验要不是就第4行有问题,要不就是4行的上下有问题, 也就是第3或者第5行有问题,反正其中的一行有问题,因为他只有一个报错。 SECTIONS { .text : { *(.text) } . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .sdata : { *(.sdata) } _gp = ALIGN(16); __got_start = .; .got : { *(.got) } __got_end = .; .sdata : { *(.sdata) } . = ALIGN(4); __bss_start = .; .sbss : { *(.sbss) } .bss : { *(.bss) } _end = .; } 看了这个例子(随便从内核CP的一个.lds文档)别急往下看,应该能找到问题了吧。我可要说结果了: 你的应该改成: OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS{ .=0x00000000; /*.=ALIGN(4);*/ //把这个去掉或者注释掉.哥子,记得给分哦,呵呵。我可找了蛮久,这种细心的问题有时真得花时间的. .text : { Start.o(.text) *(.text) } .=ALIGN(4); .data : { *(.data) } .=ALIGN(4); bss_start = .; .bss : { *(.bss) } bss_end = .; }
回复
相关推荐
发帖
驱动开发/核心开发
创建于2007-09-28

2.1w+

社区成员

硬件/嵌入开发 驱动开发/核心开发
申请成为版主
帖子事件
创建了帖子
2015-10-02 07:23
社区公告
暂无公告