编译器的链接程序会调用BFD库来访问OBJ和压缩文件。BFD库提供了一套通用的前端接口函数来操作OBJ文件,使编译器不用考虑其所链接的OBJ文件具体采用什么格式。如果有一种新的OBJ文件,那么只要把其对应的操作函数添加到BFD库中就行了。尽管如此,为了节省运行时内存,链接器一般会被配置成只支持当前所有OBJ文件格式的一个子集。我们可以使用命令objdump -i命令来查看当前系统中配置支持的格式。
由于要考虑相互制约的需求,大多数BFD库的实现会选择一种折衷方案。影响BFD库设计的主要因素是效率:any time used converting
between formats is time which would not have been spent had BFD not been involved. This is partly offset by abstraction
playback; since BFD simplifies applications and back ends, more time and care may be spent optimizing algorithms for a
greater speed.
BFD库实现的一个小的瑕疵就是可能会导致信息丢失。有两个地方可能会发生这种事:转换和输出时。例如,a.out文件中位对齐信息。
另外一个例子是COFF中各节对应的名字。COFF文件对节的总数没有限制,并且每一节会附带一个名字。如果链接的目标类型不支持
这样的结构,那么这些节的名字可能会丢失,也可能这些节会被压缩成几节。
You can circumvent this problem by describing the desired input-to-output section mapping with the linker command
language.
当然,这种情况并不严重如果链接的输入和输出目标文件格式都一样的话。
当一个OBJ文件被打开时,BFD例程库会自动检测输入文件的格式,然后就会生成一个访问此种格式的函数指针,并采用对应的数据结
构来遍历文件中个各块数据。不同的数据块会表针不同种类的信息。例如,链接器通常会需要加载符号表。那么,把符号表从OBJ文件
中提取出来就是BFD的责任了。当程序链接完成需要把符号表写进输出文件时,函数指针会引用另一个BFD后端例程把生成的符号表转
换成相应的OBJ格式。
BFD header file version (GNU Binutils for Ubuntu) 2.18.93.20081009
elf64-x86-64
(header little endian, data little endian)
i386
elf32-i386
(header little endian, data little endian)
i386
a.out-i386-linux
(header little endian, data little endian)
i386
efi-app-ia32
(header little endian, data little endian)
i386
efi-bsdrv-ia32
(header little endian, data little endian)
i386
efi-rtdrv-ia32
(header little endian, data little endian)
i386
efi-app-x86_64
(header little endian, data little endian)
i386
efi-bsdrv-x86_64
(header little endian, data little endian)
i386
efi-rtdrv-x86_64
(header little endian, data little endian)
i386
elf64-little
(header little endian, data little endian)
i386
elf64-big
(header big endian, data big endian)
i386
elf32-little
(header little endian, data little endian)
i386
elf32-big
(header big endian, data big endian)
i386
srec
(header endianness unknown, data endianness unknown)
i386
symbolsrec
(header endianness unknown, data endianness unknown)
i386
tekhex
(header endianness unknown, data endianness unknown)
i386
binary
(header endianness unknown, data endianness unknown)
i386
ihex
(header endianness unknown, data endianness unknown)
i386
elf64-x86-64 elf32-i386 a.out-i386-linux efi-app-ia32
i386 elf64-x86-64 elf32-i386 a.out-i386-linux efi-app-ia32
efi-bsdrv-ia32 efi-rtdrv-ia32 efi-app-x86_64 efi-bsdrv-x86_64
i386 efi-bsdrv-ia32 efi-rtdrv-ia32 efi-app-x86_64 efi-bsdrv-x86_64
efi-rtdrv-x86_64 elf64-little elf64-big elf32-little elf32-big
i386 efi-rtdrv-x86_64 elf64-little elf64-big elf32-little elf32-big
srec symbolsrec tekhex binary ihex
i386 srec symbolsrec tekhex binary ihex