【问题标题】:binutils - kernel - "_binary" meaning?binutils - 内核 - “_binary”是什么意思?
【发布时间】:2015-05-16 02:08:12
【问题描述】:

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

现在以这种方式创建了两个符号:

    extern char _binary_initcode_start[], _binary_initcode_size[];

在函数内部。

讲座说:

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

我了解 binutils 正在获取此汇编代码的地址和大小。

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

  • _binary -> 原来是汇编代码

  • _initcode -> 我的文件名

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

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

不过,我没有证据。


问题是:

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

谁能告诉我我的假设是否正确以及是否比这更好:规则

谢谢

【问题讨论】:

    标签: c assembly linker kernel binutils


    【解决方案1】:

    奇怪的是,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,所以在此过程中会定义上述符号。

    【讨论】:

    • 哇.. 再次感谢 Jester。您非常知识渊博!太棒了:)
    【解决方案2】:

    当在程序集文件中定义 .global 变量时,为了让 C 文件能够引用该变量,C 文件必须在变量名前添加一个“_”。这样链接器就可以将 C 文件中的名称与汇编文件中的名称“链接”起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 2022-01-02
      • 2013-03-31
      相关资源
      最近更新 更多