libandroid-shmem 在 chrooted linux 中显示无效的 ELF 标头

libandroid-shmem 在 chrooted linux 中显示无效的 ELF 标头

我已经在 android marshmallow (snapdragon 650 [64bit]) 中对 Debian 进行了 chroot。

我在 chrooted debian 中安装了iceweasel。但它显示了这个错误::

(firefox:16210): Gdk-WARNING **: shmget failed: error 38 (Function not implemented)   Segmentation fault

所以,我编译了libandroid-shmem.so由此回购协议使用 android-ndk 并从 armv8-a 文件夹复制到/libchrooted debian 目录。然后它要求liblog.so.

iceweasel: error while loading shared libraries: liblog.so: cannot open shared object file: No such file or directory

所以我liblog.so从 android-ndk 复制到 chrooted debian/lib目录。

现在当我跑步时env LD_PRELOAD="/lib/libandroid-shmem.so" iceweasel 。它显示此错误:

iceweasel: error while loading shared libraries: /usr/lib/aarch64-linux-gnu/libc.so: invalid ELF header

以下是一些细节:: file /lib/libandroid-shmem.so

/lib/libandroid-shmem.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=5ad4582c76effbe27a6688369ad979fea5dfac2a, stripped




$ cat /usr/lib/aarch64-linux-gnu/libc.so


/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-littleaarch64)
GROUP ( /lib/aarch64-linux-gnu/libc.so.6 /usr/lib/aarch64-linux-gnu/libc_nonshared.a  AS_NEEDED ( /lib/aarch64-linux-gnu/ld-linux-aarch64.so.1 ) )

答案1

你是怎么编译的?我编译并没有遇到任何错误的 elf 错误这是我编译 libandroid-shmem 的步骤

  1. 进入chroot

  2. 克隆这个存储库 git clone https://github.com/pelya/android-shmem

  3. 获取子模块git submodule update --init libancillary
  4. 现在,要为 aarch64 或 arm64 编译它,您必须在 build.sh 脚本中进行一些更改,因此转到克隆存储库cd android-shmem并删除 build.sh 并使用我正在使用的任何文本编辑器创建新的这里vi build.sh
  5. 将其复制并粘贴到 build.sh 中并保存

    #!/bin/sh
    
    
    
        gcc -shared -fpic -std=gnu99 -Wall *.c -I . -I libancillary \
                    -o libandroid-shmem.so -Wl,--version-script=exports.txt -lc -lpthread && \
    
    strip libandroid-shmem.so
    
  6. 现在运行构建脚本./build.sh,您可以在当前目录中看到编译后的二进制文件

  7. 现在导出它export LD_PRELOAD=/path/to/your/binary

答案2

问题似乎是,您使用 android-ndk 编译了库。这样它就可以链接到 android 版本的libc.so.

在某些 Linux 发行版上libc.so似乎是链接器脚本而不是实际的库,而 android-ndk 显然希望它是一个库。

然而,即使您将 libc.so 替换为实际库的符号链接,您编译的 libandroid-shmem.so 仍然无法工作,因为它会抱怨 libc 版本不匹配。 (我有/lib/aarch64-linux-gnu/libc.so.6: version `LIBC' not found (required by /data/data/com.termux/files/usr/lib/libandroid-shmem.so)


相反,直接在 chroot 环境中编译库,如中所述辅助s回答。注意:我不需要更改build.sh脚本 - 上游提供的脚本工作得很好。

相关内容