使用arm-linux-gcc编译的一些疑惑?

wesley 2012-11-21 05:28:44
最近学arm-linux-gcc编译,对其了解不是很多,求高手指点以下几点疑惑。
1、我们在windows下使用编辑器编译可执行文件.bin时候,在编辑器中需要设置芯片的型号,起始地址那些信息,而在用arm-linux-gcc时这些信息为什么不用设置?
2、arm-linux-gcc中 用makefile将多个.c .h .S文件链接成.bin文件时 链接有没有先后顺序,如果有顺序该怎么排?
3、arm-linux-gcc的makefile都有指定程序起始地址 比如Ttext 0x00000000,这个地址是不是程序烧到CPU后CPU从这个地址开始运行?
...全文
330 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
HMGuardian 2012-11-23
  • 打赏
  • 举报
回复
.....这个要跳到指定行的话………… 嗯,我用gcc通常都是在终端下使用,没有使用集成开发环境…… 这里是一个你亿描述的错误示例: test.c: 在函数‘main’中: test.c:16:2: 错误: expected ‘;’ before ‘printf’ test.c:16:2 这里的16就是指的文本中的16行。 接下来就要看你使用的是什么文本编辑器了。 如果是vim的话,命令模式下16g 如果是gedit的话,那就鼠标滚吧……
wesley 2012-11-23
  • 打赏
  • 举报
回复
引用 3 楼 JQGuardian 的回复:
代码段重定位地址用这个选项指定 -Ttext 0x0000000 嗯,有些汇编语言中有org xxxxxx,不知你懂不懂这个,-Ttext和这个的效果一样。 比如程序中有一个常量位于距程序开始处0x123,有些指令是通过ldr [pc+偏移] 来访问这个地址,这没有什么问题。但有些编译器处理成ldr [地址]这种形式,对于这种形式-Ttext就必不可少了。因为,如果实际运行的地址与链接时……
谢楼上,还有 我用arm-linux-gcc编译时 出现了错误 如果能跳到错误行去解决错误?比如我的main.c文件中语法编辑错误 少了个;或者变量写错了啊 这是预编译通不过 我如何跳到该错误行去呢? 以前用windos下的工具双击错误就可以跳到那行去了。
wesley 2012-11-22
  • 打赏
  • 举报
回复
懂了一点,找个uboot源码看看,还有就是那个Ttext------------- 比如这句:arm-linux-ld -Ttext 0x0000000 -g crt0.o key_led.o -o key_led_elf 如何去理解呢?链接顺序为crt0.o key_led.o 前面那个地址如何理解
HMGuardian 2012-11-22
  • 打赏
  • 举报
回复
代码段重定位地址用这个选项指定 -Ttext 0x0000000 嗯,有些汇编语言中有org xxxxxx,不知你懂不懂这个,-Ttext和这个的效果一样。 比如程序中有一个常量位于距程序开始处0x123,有些指令是通过ldr [pc+偏移] 来访问这个地址,这没有什么问题。但有些编译器处理成ldr [地址]这种形式,对于这种形式-Ttext就必不可少了。因为,如果实际运行的地址与链接时给定的地址不一样时,ldr [地址]这种形式的方问将得不到正确的结果。
HMGuardian 2012-11-21
  • 打赏
  • 举报
回复
使用arm-linux-gcc的时候不是不用设置,而是编译器采用了默认设置。 链接使用的是arm-linux-ld, 通常会为它指定一个链接脚本,链接脚本中可以控制链接顺序。你可以找个u-boot的源码包,然后找.lds文件,打开来看看,一般代码段第一个都会是start.o。至于其他的文件,应该是跟执行arm-linux-ld时给的文件名顺序决定的。 Ttext 是arm-linux-ld的选项,用于指定重定位基地址。通常要将程序烧到Ttext指定的地址才能执行,因为.c代码中有很多常量,如果在别的地方运行,极有可能不能正常加载这些常量。

21,600

社区成员

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

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