|
|
|
|
 问大家一个gcc编译的问题。 - soupbetter [ 2006-04-10 11:01 | 329 byte(s)]
 Re: 问大家一个gcc编译的问题。 - shy828301 [ 2006-04-10 11:09 | 35 byte(s)]
 Re: 问大家一个gcc编译的问题。 - soupbetter [ 2006-04-10 12:11 | 135 byte(s)]
 Re: 问大家一个gcc编译的问题。 - shy828301 [ 2006-04-10 12:33 | 62 byte(s)]
 Re: 问大家一个gcc编译的问题。 - soupbetter [ 2006-04-10 17:49 | 97 byte(s)]
 Re: 问大家一个gcc编译的问题。 - soupbetter [ 2006-04-13 17:50 | 205 byte(s)]
 Re: 问大家一个gcc编译的问题。 - shy828301 [ 2006-04-13 18:03 | 329 byte(s)]
 Re: 问大家一个gcc编译的问题。 - soupbetter [ 2006-04-19 22:21 | 340 byte(s)]
 Re: 问大家一个gcc编译的问题。 - daiyuwen [ 2006-04-25 17:36 | 728 byte(s)]
 Re: 问大家一个gcc编译的问题。 - soupbetter [ 2006-04-27 18:43 | 18 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
|
我目前的认识是:gcc编译出来的执行文件都是某一种格式(format)的,比如elf格式,它要想运行在host上需要host上已有的程序来解释它,比如有个pmon之类类似bios的程序。如果我想编译出一个在flash上运行上电自加载的执行文件,其实也相当于一个bios的执行文件,它是不是应该全部由机器码组成,不含格式信息?gcc怎么使用才能做到呢?谢谢您的帮助! :)
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
恩,的确用objcopy -O binary是可以生成二进制的。感谢shy! 现在的问题是:如果原来的汇编文件有数据段的话,ld的用法不甚明了啊,到底Ttext和Tdata的参数如何设置呢。。。不知大家有没有关于ld用法特别实用的资料? :)
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
嗯,非常全的资料,谢谢! :)
读的过程中想到一个很“基础”的问题:
比如 ld -Ttext 0xbfc00000 ......
这个地址是什么地址呢? 是物理地址?貌似不太对啊,因为cpu对物理地址的分配应该是事先确定的吧。是逻辑地址?是不是有了这个参数项,程序中的相对地址都以它为基址连接成物理地址? 不懂,实在是基础薄弱啊。。。 期待指教 :)
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
-Ttext, -Tdata, -Tbss指定的是运行时的地址,GNU 手册里叫做relocation address, 有的工具叫它execute address。什么是运行时的地址, 举个例子:
int flag = 0xFF;
int foo (void)
{
return flag;
}
全局变量flag将被放在data段里,如果你在连接的时候指定了-Tdata 0x1000, flag位于data段偏移0处,那么生成的foo的代码会象这样:
从0x1000 处取一个4字节的整型数来
也就是说运行时的代码知道data段的位置,期望那里是正确的数据。 这就需要有外部的力量把text, data,BSS等搬到代码期望的位置。如果有操作系统的话,这工作由loader完成,如果没有操作系统,就得程序自己完成。
relocation address与用不用MMU没有关系。
|
|
|
[Original]
[Print]
[Top]
|
|
|