0

我要做的就是从图像中提取一些符号并使用(链接)来自不同图像的符号。

使用 armccc/armlink,当指定 --symdefs= 时,它会创建包含符号及其地址的文件。
另一方面,如果您删除未使用的符号,它只会更新现有符号。如果您将此文件包含在编译中,它会将先前图像的符号与新图像链接起来。

但我找不到类似的 GNU 工具链(arm-none-eabi-)方法。如果我使用 arm-none-eabi-nm,它会创建类似于 armcc --symdefs 选项的符号列表,但无法找到将此符号列表用于第二个图像编译的方法。(也没有办法过滤没有 grep 的符号)。

其他选项似乎也使用 arm-none-eabi-objcopy 但也找不到如何将它与第二个图像编译一起使用。

在 GNU 工具链中,我们怎样才能做到这一点?任何想法?

另一方面,如果可能的话,我想将其应用于 Keil uVision IDE。谢谢。

4

1 回答 1

1

对 armcc 了解不多,使用标准 GNU 工具模拟这种行为可能很容易。例如生成 symdef 文件:

$ cat tmp.c
int foo() { return 0; }
int bar() { return 1; }
int main() { return 0; }
$ gcc tmp.c
$  readelf -sW a.out | grep GLOBAL | awk '{print $8 " " $2 }' | grep -v '^_' > symdef.lst

然后使用它通过--defsym标志为链接器定义缺少的符号:

$ LDFLAGS=$(cat symdef.lst |  awk '{print "-Wl,--defsym=" $1 "=" $2}' | tr '\n' ' ')
$ echo $LDFLAGS
-Wl,--defsym=bar=0000000000400481 -Wl,--defsym=foo=0000000000400476 -Wl,--defsym=main=000000000040048
于 2017-01-02T18:25:23.607 回答