2012/12/16 刘智猷 <liuzhiyou.cs@xxxxxxxxx>: > Hi, all > > 我在移植binutils时遇到了一点关于重定位的问题。上次我提到bfd支持elf的工作中,最主要的事情是对重定位的处理。在我又看了一些资料和代码后,我发现具体的情况是这样的: > > ELF格式本身只定义了重定位这个概念本身,而没有定义具体的重定位类型和每个类型对应的操作,这些东西应该由每个希望使用ELF的架构根据自身的指令系统来设计。例如,x86的ELF定义了下面这些重定位类型: > > /* i386/elf relocations */ > BFD_RELOC_386_GOT32, > BFD_RELOC_386_PLT32, > BFD_RELOC_386_COPY, > BFD_RELOC_386_GLOB_DAT, > BFD_RELOC_386_JUMP_SLOT, > BFD_RELOC_386_RELATIVE, > BFD_RELOC_386_GOTOFF, > BFD_RELOC_386_GOTPC, > > 总的原则是,重定位的设计应该让linker/loader能够支持.o, > .a和.so需要的各种语义。而且,在loader重定位阶段,不能修改.text段,只能修改.data段(至少x86上是这样的)。 好像,是计算出text的段首地址,然后用一个sym表示,段内信息皆为sym+offset表示。 > > 所以,现在我们需要为Unicore32设计一套重定位方案。我的问题是:有什么设计文档可供参考吗? > > 另外,llvm是要翻译到汇编代码还是机器指令?如果是机器指令,恐怕也有这个问题。 LLVM本身支持 |->bc IR->MC->|->asm |->elf 目前的计划是 |->bc IR->MC->|->asm->binutils 所以,暂时不会遇到这个问题。 > > 祝好, > 刘智猷