libandroid-shmem은 루트가 지정된 Linux에서 잘못된 ELF 헤더를 표시합니다.

libandroid-shmem은 루트가 지정된 Linux에서 잘못된 ELF 헤더를 표시합니다.

Android marshmallow(snapdragon 650 [64bit])에서 Debian을 루트로 지정했습니다.

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-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를 사용하여 라이브러리를 컴파일한 것 같습니다. 이렇게 하면 안드로이드 버전에 연결할 수 있습니다 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 환경에서 직접 라이브러리를 컴파일하십시오.보조자에스답변. 참고: 스크립트를 변경할 필요가 없었습니다 build.sh. 업스트림에 제공된 스크립트는 잘 작동합니다.

관련 정보