binutils - kernel - " _binary"含义?

时间:2015-03-13 14:29:27

标签: c assembly linker kernel binutils

我正在阅读xv6讲座。 我有一个名为initcode.S的文件,它将在内核中链接。

现在创建了两个符号:

    extern char _binary_initcode_start[], _binary_initcode_size[];

在一个函数中。

讲座说:

  

作为内核构建过程的一部分,链接器嵌入了定义两个特殊符号的二进制文件_binary_initcode_starcode_size,指示二进制文件的位置和大小。

我知道binutils正在获取这个汇编代码的地址和大小。

我想知道这个符号:它是默认的吗?我的搜索没有清楚地证明这一点。

  • _binary - >它最初是汇编代码

  • _initcode - >我的档案名称

  • _start - >我感兴趣的参数。

这意味着编译的任何汇编代码也会有这些变量。

但是,我没有这方面的证据。


问题是

_binary_myAsmFileHere_myParameterhere默认变量结构binutils给汇编文件导出它们的地址,大小等等吗?

有人可以告诉我,我的假设是否正确以及是否比这更好:规则

由于

2 个答案:

答案 0 :(得分:1)

当在程序集文件中定义.global变量时,为了使C文件能够引用该变量,C文件必须在前面添加一个' _'到变量名。这是链接器可以链接' C文件中的名称,在程序集文件中具有名称。

答案 1 :(得分:0)

奇怪的是,ld手册中似乎没有记录。但是,man objcopy确实这样说:

  

您可以通过引用来访问程序内的二进制数据   转换过程创建的特殊符号。这些   符号称为_binary_objfile_start,_binary_objfile_end和   _binary_objfile_size。例如您可以将图片文件转换为目标文件,然后使用这些符号在代码中访问它。

当嵌入二进制文件时,ld显然使用相同的逻辑。 请注意,xv6的Makefile包含用于链接内核的这一行:

$(LD) $(LDFLAGS) -T kernel.ld -o kernel entry.o $(OBJS) -b binary initcode entryother

如您所见,它使用-b binary嵌入文件initcodeentryother,因此上述符号将在此过程中定义。