【问题标题】:Link symbols with absolute address to PIC binary将具有绝对地址的符号链接到 PIC 二进制文件
【发布时间】:2018-10-15 11:28:13
【问题描述】:

我正在创建一个由多个二进制图像(通过 python 脚本组合在一起)构建的新图像。问题是最后一个二进制图像必须用 fPIC 编译,而以前的图像不是。最后一张图像(使用 fPIC 编译的图像)使用 --just-symbols 重用其他二进制图像中的函数。

问题是当我试图从另一个二进制文件(--just symbols 接收的符号)调用函数时,符号的地址是相对的而不是绝对的,这会导致硬错误。

如何将具有绝对地址的符号链接到 PIC 二进制文件?

代码示例:

文件 fun.c 编译成 fun.elf 剥离到 fun.bin:

int fun(int a,int b)
{
    print("help\r\n");
}

使用-fPIC--just-symbols=fun.elf 编译的文件fail.c:

int fail(void)
{
    fun(1,3); 
}

在示例中,fail.bin 中 fun 的地址是相对的,而不是绝对的。

【问题讨论】:

  • 如果我理解正确的话,你有一个静态链接的可执行文件,你想要一个将这些静态地址硬编码的 PIC 库?
  • 几乎我有一个用 PIC 编译的可执行文件,并且我将这些符号硬编码
  • 供将来参考:在嵌入式系统中使用 3 个字母的首字母缩写词“PIC”并不是一个好主意,因为每个人都会立即想到 Microchip PIC 而不是与位置无关的代码。
  • fail()fun() 的调用到底出了什么问题?即使它对引用 fun() 做了一个相对偏移,有什么问题?
  • “以前的图像”如何链接?具体到哪些地址。

标签: c embedded bootloader position-independent-code


【解决方案1】:

所以,经过更多研究后,我发现这是无法做到的。 您不能强制使用 fPIC 标志编译的应用程序的 pc 不将 PIC 用于特殊符号(在我的情况下,符号来自 --just-symbols)。

我选择的解决方案实际上是解析非 PIC elf 文件并获取所需函数的地址。使用这些地址并将它们转换为所需的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多