【问题标题】:How to obtain the BFD architecture specification for the current platform?如何获取当前平台的 BFD 架构规范?
【发布时间】:2011-10-13 17:13:53
【问题描述】:

我使用以下方法在 C 程序中嵌入了一个文本文件:http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967

a.out:prog.c file.text
    objcopy --input binary --output elf64-x86-64 --binary-architecture i386 file.text file.o
    gcc prog.c file.o

objcopy 需要使用“--output”选项指定目标。

如何在 Makefile 中设置“--output”,以便 objcopy 使用用户的架构?

谢谢。

【问题讨论】:

  • 这个问题当然等同于问“如何从命令行学习正确的架构规范?”,但我并不清楚答案。
  • 我尝试使用 'uname' 但它没有给我解决方案。
  • 是的。我也试过了。我查看了filearnm。我唯一的想法是为file 定制一个magic 文件,但我不知道如何开始组装这样的东西。
  • 如果您告诉我们您拥有什么操作系统,将会有所帮助。不同的系统有不同的语法来询问架构。
  • 既然您在这里谈到“用户”:请不要将此 objcopy hack 引入生产或将其发布到野外。这是一个漂亮的 hack,但只是作为一个 hack:展示技术可以做什么。在任何实际使用中,只需在运行时加载文件或使用简单的 sed/awk/perl/whatever 魔法将其转换为 C 文件。

标签: gcc gnu-toolchain objcopy


【解决方案1】:

首先:您不是在尝试模仿 GCC ld 的-b 功能,是吗?更详细地说:GCC ld 实际上可以加载许多二进制格式,请参阅the documentation。如果这是您想要实现的目标,例如:

 gcc prog.c -Wl,-b -Wl,binary file.o

可能会为您节省整个 objcopy 调用。

虽然我无法找到有关该问题的文档,但 objdump -i 的输出似乎是按偏好排序的,所以

 `objdump -i | head -n 2 | tail -n 1`

应该扩展到通常的目标架构。再次声明:我没有关于这种行为的文档,所以最好不要盲目依赖它。

【讨论】:

  • 感谢这个快速的 BFD 目标单线!
  • 当我在测试程序中尝试这个时,gcc 对我抱怨 $ gcc use-binblob.c -Wl,-b -Wl,binary binblob -lc /usr/bin/ld: .../libc.so:(.data+0x0): multiple definition of _binary__lib_x86_64_linux_gnu_libc_so_start; .../libc.so:(.data+0x0): first defined here ... /usr/bin/ld: .../Scrt1.o: in function _start: (.text+0x16): undefined reference to __libc_csu_fini ... /usr/bin/ld: use-binblob.c:(.text+0x6f): undefined reference to putchar /usr/bin/ld: a.out: hidden symbol __TMC_END__ isn't defined /usr/bin/ld: final link failed: bad value collect2: error: ld returned 1 exit status
  • (与无法在 libc 中链接有关的各种错误;似乎-Wl,b“转移”到了整个输出对象。我怀疑这可以通过链接器映射文件解决(以确保它only 应用于二进制 blob 文件,仅应用于二进制 blob 文件);我还没有弄清楚如何,
猜你喜欢
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多