在Linux下怎么编译、连接生成ARM指令的二进制代码?

yangcuncunzhang 2010-11-12 05:23:41
我不想用通用的bootloader(UBoot),因为它是GPL license . 需要公开源码的,我想自己做一个bootloader,不需要太多功能,只要能将kernel从Nand Flash load出来运行就好了,应该只需要操作DDR RAM、Nand Flash。

在linux环境下,用makefile来编译代码,我仅仅知道可以在makefile中指定.c或者.s,但是一般都时编译、连接成一个linux下可以运行的应用程序。 不知道在makefile或者是其它什么地方有什么设定,可以让编译、连接的是CPU直接可以执行的ARM指令代码? 就象uboot image一样?

我正在分析uboot的makefile,有哪位大侠已经知道的,恳请指点。
...全文
204 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangcuncunzhang 2010-12-14
  • 打赏
  • 举报
回复
谢谢上面两位朋友的回复,我自己也搞定了,用gcc编译所有的源文件,最后用ld链接成二进制代码。
如果需要指定装载(运行)地址,也需要用到楼上说的链接脚本!

多谢了!
哥特de忧伤 2010-11-13
  • 打赏
  • 举报
回复
比如你需要这样的几个文件
head.S 用来构建C语言的环境,简单的只设置堆栈指针,没有中断向量。
init.c有了C语言环境后就要初始化一些控制器,看门狗,存储器,串口,nandflash控制器等,nandflash read函数将代码搬运到sdram中,
nand.c专门用来进行nandflash的操作,读,写,擦除。
main.c你的主函数,用来你的逻辑的建立。
应用程序
gcc xxx.c -o xxx
主要是连接器已经帮你将启动代码连接进去了,而我们现在要自己使用连接器,那么就要写连接脚本,
简单的:
SECTIONS {
firtst 0x00000000 : { head.o init.o }
second 0x30000000 : AT(4096) { main.o nand.o}
}

而Makefile简单一点的就:
objs := head.o init.o nand.o main.o

boot.bin : $(objs)
arm-linux-ld -Tnand.lds -o boot_elf $^
arm-linux-objcopy -O binary -S boot_elf $@
arm-linux-objdump -D -m arm boot_elf > boot.dis
%.o:%.c
arm-linux-gcc -Wall -c -O2 -o $@ $<

%.o:%.S
arm-linux-gcc -Wall -c -O2 -o $@ $<

clean:
rm -f boot.dis boot.bin boot_elf *.o

我所知道的也就这么多了,希望对你有帮助,我是菜鸟,所有可能有错!(*^__^*) 嘻嘻……
memoleak 2010-11-12
  • 打赏
  • 举报
回复
应该分析的是连接脚本文件,编译是一样的,在连接的时候,根据连接脚本的要求生成相应格式的文件(image或者executable)

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧