[llvm-uc] Re: [llvm-uc] Unicore32的重定位(relocation)设计

  • From: Jia Liu <proljc@xxxxxxxxx>
  • To: llvm-uc@xxxxxxxxxxxxx
  • Date: Mon, 17 Dec 2012 08:00:35 +0800

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

所以,暂时不会遇到这个问题。

>
> 祝好,
> 刘智猷

Other related posts: