前一阵子,一直在研究Visual DSP与uclinux的二进制兼容问题,一个偶然的机会看到了blackfin.uclinux.org上的一段话:
Blackfin patch: Delete code to handle certain relocs
- From: Bernd Schmidt
- To: binutils at sources dot redhat dot com
- Date: Sat, 25 Mar 2006 19:20:15 +0100
- Subject: Blackfin patch: Delete code to handle certain relocs
The Blackfin port has some ancient code that was written for compatibility with the in-house VDSP compiler. We support a relocation stack, so that you can encode arbitrary arithmetic in relocations.
呵呵,原来如此!
为了完成一个长久的心愿,看来还得费点劲把链接器的这些代码找出来再做些修改才行,估计ld的代码应该也不是特别复杂。
不过长时间在linux和windows之间切换,总觉得不爽。结果就是将ld搞到vs2005下编译了一道。事已至此,又冒出一个想法,不知道gcc是否也可以在vs2005下编译,这样研究起来岂非简单很多。(典型的见异思迁!!)
又经过一段时间,终于搞定!聊记下来以供以后参考!当然,此处仅仅是一个c compiler而已,不包含libc这样的东西。
bfin-gcc-4.1
首先在linux平台下切换到gcc4.1源码的目录:
./configure
make
这样除了生成可执行文件之外,还会生成很多动态的.c和.h文件,因为在windows平台下这些文件可是很难生成的呦,也没有必要在这些枝节上费工夫。把这些文件都copy到windows下备用。.c和.h文件,当然是可以用到工程中去的,至于.o文件,则是很直观地揭示了工程中应该包含的文件,总比分析Makefile来得容易!
下面就该到vs2005上场了。
针对gcc的几个目录建了相应的lib,在这样做之前其实也不知道为什么,就是看见在每个目录下都生成了一个config.h文件。
再建了一个叫gcc4的exe工程。
也不知道应该加入什么文件,由少到多吧,先加入main,链接器提示少什么再往里加!就是再这样的原则下,最多的时候大概有600个链接错误,最后借助链接器和.o文件的帮助,统统杀无赦,最后就得到了一个gcc4.exe。
写个最简单的C程序试一个:
void main(void)
{
}
运行gcc4 main.c,生成了一个main.s:
.file "main.c"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
popl %ecx
leave
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1 2008-1-10 release 2007"
.section .note.GNU-stack,"",@progbits
386的代码,不是希望的bf561!
看来是后端生成代码这一块搞错了,研究中…..