前提・実現したいこと
Androidの共有ライブラリ(.soファイル)をLinux(ARM32)で利用したいです。
Androidの共有ライブラリ(.soファイル)をAndroid(ARM32)で実行は問題なく出来ました。
(Java経由の呼び出しでは無く、実行ファイルから共有ライブラリの関数を呼び出す形です。)
AndroidもLinuxの一種のはずです。
しかしなぜLinuxのRaspbian(Raspberry Pi 4)では共有ライブラリ(.soファイル)を利用するとSegmentation faultになるのでしょうか?
LinuxであればELF形式でアーキテクチャが一致していれば動作すると思っていたのですが、そもそもこの理解が間違っているのでしょうか?
発生している問題・エラーメッセージ
bash
1$ ./a.out 2Segmentation fault 3
libhelloworld.soのソースコード
- jni/Android.mk
Makefile
1LOCAL_PATH := $(call my-dir) 2 3include $(CLEAR_VARS) 4 5LOCAL_MODULE := helloworld 6LOCAL_SRC_FILES := ../main.c 7LOCAL_CFLAGS += -fPIE 8 9include $(BUILD_SHARED_LIBRARY)
- jni/Application.mk
Makefile
1APP_ABI := armeabi-v7a 2APP_PLATFORM := android-19
- main.c
c
1#include <stdio.h> 2 3int say_helloworld () 4{ 5 printf("helloworld\n"); 6 return 0; 7}
実行ファイル(a.out)のソースコード
c
1// AndroidOS用はndk-buildでコンパイルした。 2// Raspberry Pi用は以下コマンドでコンパイルした。 3// gcc main.c -ldl 4#include <stdio.h> 5#include <dlfcn.h> 6 7void (*say_helloworld)(); 8 9int main() 10{ 11 void* handle = dlopen("./libhelloworld.so", RTLD_LAZY); 12 say_helloworld = (void (*)())dlsym(handle, "say_helloworld"); 13 say_helloworld(); 14 15 return 0; 16}
試したこと
- Android OSのシェルで実行すると問題なく実行できました。
bash
1> adb shell 2$ ./main 3helloworld
- アーキテクチャが一致しているかの確認
Android, LinuxどちらもARM32環境で一致しています。
- straceの確認
$ strace ./a.out execve("./a.out", ["./a.out"], 0xbe816680 /* 26 vars */) = 0 brk(NULL) = 0x344000 mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb6f55000 access("/etc/ld.so.preload", R_OK) = 0 openat(AT_FDCWD, "/etc/ld.so.preload", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=54, ...}) = 0 mmap2(NULL, 54, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = 0xb6f54000 close(3) = 0 readlink("/proc/self/exe", "/home/pi/a.out", 4096) = 20 openat(AT_FDCWD, "/usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\254\3\0\0004\0\0\0"..., 512) = 512 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 _llseek(3, 16748, [16748], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 960) = 960 _llseek(3, 16424, [16424], SEEK_SET) = 0 read(3, "A,\0\0\0aeabi\0\1\"\0\0\0\0056\0\6\6\10\1\t\2\n\3\f\1\22\4\24"..., 45) = 45 fstat64(3, {st_mode=S_IFREG|0644, st_size=17708, ...}) = 0 mmap2(NULL, 81964, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6f12000 mprotect(0xb6f16000, 61440, PROT_NONE) = 0 mmap2(0xb6f25000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0xb6f25000 close(3) = 0 munmap(0xb6f54000, 54) = 0 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=80552, ...}) = 0 mmap2(NULL, 80552, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb6efe000 close(3) = 0 openat(AT_FDCWD, "/lib/arm-linux-gnueabihf/libdl.so.2", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0 \n\0\0004\0\0\0"..., 512) = 512 _llseek(3, 8688, [8688], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1080) = 1080 _llseek(3, 8340, [8340], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 8688, [8688], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1080) = 1080 _llseek(3, 8340, [8340], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 8688, [8688], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1080) = 1080 _llseek(3, 8340, [8340], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 fstat64(3, {st_mode=S_IFREG|0644, st_size=9768, ...}) = 0 mmap2(NULL, 73924, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6eeb000 mprotect(0xb6eed000, 61440, PROT_NONE) = 0 mmap2(0xb6efc000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1000) = 0xb6efc000 close(3) = 0 openat(AT_FDCWD, "/lib/arm-linux-gnueabihf/libc.so.6", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\300x\1\0004\0\0\0"..., 512) = 512 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 _llseek(3, 1293204, [1293204], SEEK_SET) = 0 read(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 2800) = 2800 _llseek(3, 1289788, [1289788], SEEK_SET) = 0 read(3, "A.\0\0\0aeabi\0\1$\0\0\0\0056\0\6\6\10\1\t\1\n\2\22\4\23\1\24"..., 47) = 47 fstat64(3, {st_mode=S_IFREG|0755, st_size=1296004, ...}) = 0 mmap2(NULL, 1364764, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb6d9d000 mprotect(0xb6ed5000, 65536, PROT_NONE) = 0 mmap2(0xb6ee5000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x138000) = 0xb6ee5000 mmap2(0xb6ee8000, 8988, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb6ee8000 close(3) = 0 set_tls(0xb6f564d0) = 0 mprotect(0xb6ee5000, 8192, PROT_READ) = 0 mprotect(0xb6efc000, 4096, PROT_READ) = 0 mprotect(0xb6f25000, 4096, PROT_READ) = 0 mprotect(0x20000, 4096, PROT_READ) = 0 mprotect(0xb6f57000, 4096, PROT_READ) = 0 munmap(0xb6efe000, 80552) = 0 brk(NULL) = 0x344000 brk(0x365000) = 0x365000 openat(AT_FDCWD, "./libhelloworld.so", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 512) = 512 close(3) = 0 --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} --- +++ killed by SIGSEGV +++ Segmentation fault
補足情報(FW/ツールのバージョンなど)
- OnePlus One(ARM32)(Android 9)
CPU: Snapdragon 801(MSM8974PRO-AC)
- Raspberry Pi 4 Model B Rev 1.2 (ARM32)(Raspbian 32bit GNU/Linux 10 (buster))
CPU: BCM2711(Cortex-A72)
cmd
1$ ndk-build -version 2GNU Make 4.2.1 3Built for x86_64-w64-mingw32 4Copyright (C) 1988-2016 Free Software Foundation, Inc. 5License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 6This is free software: you are free to change and redistribute it. 7There is NO WARRANTY, to the extent permitted by law.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。