我正在阅读xv6讲座。 我有一个名为initcode.S的文件,它将在内核中链接。
现在创建了两个符号:
extern char _binary_initcode_start[], _binary_initcode_size[];
在一个函数中。
讲座说:
作为内核构建过程的一部分,链接器嵌入了定义两个特殊符号的二进制文件_binary_initcode_starcode_size,指示二进制文件的位置和大小。
我知道binutils正在获取这个汇编代码的地址和大小。
我想知道这个符号:它是默认的吗?我的搜索没有清楚地证明这一点。
_binary
- >它最初是汇编代码
_initcode
- >我的档案名称
_start
- >我感兴趣的参数。
这意味着编译的任何汇编代码也会有这些变量。
但是,我没有这方面的证据。问题是:
是_binary_myAsmFileHere_myParameterhere
默认变量结构binutils给汇编文件导出它们的地址,大小等等吗?
有人可以告诉我,我的假设是否正确以及是否比这更好:规则
由于
答案 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
嵌入文件initcode
和entryother
,因此上述符号将在此过程中定义。