【问题标题】:Cross-compiling ltrace for arm-linux为 arm-linux 交叉编译 ltrace
【发布时间】:2011-08-04 06:00:03
【问题描述】:

经过一堆补丁后,我能够运行 Makefile,但它现在在最后一步崩溃:(。这是我得到的错误:

arm-none-linux-gnueabi-gcc main.o libltrace.a -lelf -o ltrace
arm-none-linux-gnueabi-gcc/bin/ld: cannot find -lelf
collect2: ld returned 1 exit status
make: *** [ltrace] Error 1

我想在 Android 上运行 ltrace。将不胜感激任何意见。

【问题讨论】:

  • 嗯,链接器找不到 libelf,所以首先确保你的系统上确实有 libelf,即运行'locate libelf.so',它应该可以找到库。发布该命令的输出。如果它位于非默认位置,则链接时可能需要使用 lib 的完整路径。
  • @Matt:libelf.so 位于 /usr/lib。如何在链接期间包含路径?
  • 我相信这是默认位置(对于 32 位系统),因此您不需要包含路径。你确定它不是 libelf.so.1 吗?你的makefile是什么样的,你是怎么调用make的?具体尝试将 CPPFLAGS 设置为 -I/usr/include/libelf 以包含 libelf 标头。
  • @Matt:我仔细检查了一下,它是 libelf.so.1。对于那个很抱歉。我在 /usr/include 中没有文件夹 libelf。您可以从这里获取 makefile packages.debian.org/sid/ltrace

标签: android cross-compiling


【解决方案1】:

您不能在自己的系统上使用 libelf 库。毕竟,您正在尝试交叉编译。您的计算机可能是基于 x86 的,手机是 arm。即使您可以说服编译器链接最终的可执行文件,您的 x86 代码也不会在 arm 上运行。

你有两个选择:

1) 也用交叉编译器编译 libelf

2) 尝试从 Debian 存档中获取 libelf 的 arm 版本,使用 dpkg -x 将其解压缩到私有目录,然后尝试链接。

您可以通过完整路径而不是 -l 来指定库名称。

【讨论】:

    【解决方案2】:

    尝试: apt-get 安装 libelf-dev 看看ld cannot find an existing library

    【讨论】:

    • @Matt@Ed:定位不显示 libelf.so.1,但 /usr/lib 中存在链接 libelf.so,目标为 libelf.so.1
    • 然后apt-get install libelf。一些发行版将其称为 elfutils 或 elfutils-libelf。
    【解决方案3】:

    考虑一下 Scratchbox。我个人讨厌交叉编译,特别是因为我是 Python 的忠实粉丝,而且很难交叉编译 Python,因为它希望在构建过程中运行 python 可执行文件(刚刚构建的那个)。当您在 x86 桌面上编译 ARM 版本的 Python 时,这显然会导致问题。由于 Scratchbox 使用仿真,它(和您)可以在您的桌面系统(在 Scratchbox 环境内)上运行您的 ARM 二进制文件,从而解决了大量的交叉编译问题。

    ScratchBox 曾用于现已失效的 Maemo 操作系统(在 ARM 上运行),但人们已经成功地将其用于 Android:

    如果你走这条路,请在评论部分告诉我。当我过去为 Maemo 开发时,我有一个 Scratchbox 虚拟机。我现在正在编写 Android 软件,所以我对让 Scratchbox 为 android 工作有一些个人兴趣。

    【讨论】: