【问题标题】:AS assembler ARM Raspberry PI 3 linking with C libraries?作为汇编器 ARM Raspberry PI 3 与 C 库链接?
【发布时间】:2018-11-01 20:34:01
【问题描述】:

我正在学习如何在我的树莓派上编程。当我编译时,我使用asld 命令来编译和链接。我想与 libc 链接并使用 malloc 但不使用 gcc 作为我的编译器。我尝试与 /usr/lib/arm-linux-gnueabihf/libc.so 链接

这是我输入的内容(编辑):

as test.s -o test.o
ld -o test test.o /usr/lib/arm-linux-gnueabihf/libc.so
./test

它已编译并链接,但是当我尝试运行它时,它说未找到测试

这里是test.s

.global _start
.extern malloc

_start:
    mov R0, #4
    bl malloc
    mov R0, #0
    mov R7, #1
    svc 0
.end

这样好吗?
还是我需要做更多的事情?
任何帮助将不胜感激?

这里是我正在做的编辑(如果使用它的某些函数,不要忘记初始化 C!):

ld -o test /usr/lib/arm-linux-gnueabihf/libc.so test.o -dynamic-linker /lib/ld-linux-armhf.so.3

【问题讨论】:

  • 如果显示未找到测试,您是如何尝试运行它的?这意味着它找不到可执行文件。 ./test?
  • @SamiKuhmonen 完全正确,它似乎无法找到它,但生成了二进制文件
  • 那么您能否说明您尝试运行可执行文件的具体方式?
  • @SamiKuhmonen 确定更新
  • 不要通过传递共享对象的名称来传递库。相反,只需在所有目标文件之后传递-lc 即可链接到 libc。如果没有找到,也传递-L/usr/lib/arm-linux-gnueabihf 告诉链接器在哪里找到它。

标签: linux assembly linker arm raspberry-pi3


【解决方案1】:

您必须通过-dynamic-linker /lib/ld-linux-armhf.so.3 将动态链接器的路径传递给ld,否则它使用不存在的/usr/lib/ld.so.1

注意:虽然这会生成一个可以运行的可执行文件,但我怀疑它是否可以正常工作,因为使用了 libc 但未初始化。

【讨论】:

  • 命令也是ld -o test /usr/lib/arm-linux-gnueabihf/libc.so test.o -dynamic-linker /lib/ld-linux-armhf.so.3
  • 请问,初始化它的最佳方法是什么,如果你知道怎么做?上面的命令也可以吗^?它对我有用,但它是否符合您的想法? @FPK@FPK
  • 1) glibc 初始化比较棘手,如果你真的想知道它的细节,研究一下 glibc 的启动文件。相反,我建议用汇编程序而不是 C 编写 main 函数,并让启动文件完成它们的工作。 2) 虽然 malloc 可能在上面的示例中有效,但我不敢打赌它在所有情况下都能正常工作。
猜你喜欢
  • 2013-03-07
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 2017-11-07
  • 2012-07-19
  • 2018-01-04
  • 2014-03-01
  • 2021-04-23
相关资源
最近更新 更多