最も単純なEXECUTABLEとSHARED_LIBRARYを作成しました。SHARED_LIBRARYは、LD_LIBRARY_PATHを変更せずにロードされません。
# ./hello
./hello
link_image[1995]: failed to link ./hello
CANNOT LINK EXECUTABLE
# LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./hello
Hello, world!
以下のすべてのコード:
first.h
#ifndef FIRST_H
#define FIRST_H
extern int first(int x, int y);
#endif /* FIRST_H */
first.c
#include "first.h"
int first( int x, int y ) {
return x + y;
}
こんにちはC
#include <stdio.h>
#include "first.h"
int main( int argc, char **argv ) {
printf( "Hello, world!\n" );
first( 1000, 24 );
return 0;
}
Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE := first
LOCAL_SRC_FILES := first.c
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
LOCAL_SHARED_LIBRARIES := first
LOCAL_LDFLAGS := -Wl,-rpath,. -Wl,-rpath,/data/data/testlib/lib
include $(BUILD_EXECUTABLE)
readelf --all hello
...
Dynamic section at offset 0xef4 contains 25 entries:
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
INTERP 0x000154 0x00008154 0x00008154 0x00013 0x00013 R 0x1
[Requesting program interpreter: /system/bin/linker]
...
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libfirst.so]
0x00000001 (NEEDED) Shared library: [libstdc++.so]
0x00000001 (NEEDED) Shared library: [libm.so]
0x00000001 (NEEDED) Shared library: [libc.so]
0x00000001 (NEEDED) Shared library: [libdl.so]
0x0000000f (RPATH) Library rpath: [.:/data/data/testlib/lib]
RPATHはここにありますが、リンカーは何らかの理由でRPATHを使用しません。
どうやらダイナミックリンカーはAndroidで問題なく動作します(LD_LIBRARY_PATHを使用し、RPATHも異なりません)
私は何を間違えますか?
明らかな何かが欠けていますか?
私の例では、RPATHには2つのディレクトリ(.:/data/data/testlib/lib)があり、1つ(。)で十分です。
この例にはJavaはありません。プロジェクトでは使用されておらず、必要ありません。
基本的に、 LD_LIBRARY_PATHを変更したり(場合によっては不可能)、ラッパーを使用して必要なすべてのライブラリをdlopenすることなく、「マイディレクトリ」から共有ライブラリをロードする標準的な方法を探しています。