![libandroid-shmem은 루트가 지정된 Linux에서 잘못된 ELF 헤더를 표시합니다.](https://linux55.com/image/104181/libandroid-shmem%EC%9D%80%20%EB%A3%A8%ED%8A%B8%EA%B0%80%20%EC%A7%80%EC%A0%95%EB%90%9C%20Linux%EC%97%90%EC%84%9C%20%EC%9E%98%EB%AA%BB%EB%90%9C%20ELF%20%ED%97%A4%EB%8D%94%EB%A5%BC%20%ED%91%9C%EC%8B%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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 폴더에서 /lib
chrooted 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을 컴파일하기 위해 취한 단계는 다음과 같습니다.
chroot를 입력하세요
이 저장소 복제
git clone https://github.com/pelya/android-shmem
- 하위 모듈 가져오기
git submodule update --init libancillary
- 이제 aarch64 또는 arm64용으로 컴파일하려면 build.sh 스크립트를 일부 변경해야 하므로 저장소를 복제
cd android-shmem
하고 build.sh를 삭제한 다음 사용 중인 텍스트 편집기를 사용하여 새 파일을 생성하세요.육여기vi build.sh
이것을 복사해서 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
이제 빌드 스크립트를 실행
./build.sh
하면 현재 디렉터리에서 컴파일된 바이너리를 볼 수 있습니다.- 지금 내보내기
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
. 업스트림에 제공된 스크립트는 잘 작동합니다.