libandroid-shmem は、root が指定された Linux で無効な ELF ヘッダーを表示します。

libandroid-shmem は、root が指定された Linux で無効な ELF ヘッダーを表示します。

Android marshmallow(snapdragon 650 [64bit])でDebianをrootとして指定しました。

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

だから私はandroid-ndkからchrooted debianディレクトリliblog.soにコピーしました。/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-shmembuild.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。アップストリームで提供されるスクリプトはうまく動作します。

関連情報