我创建了最简单的可执行程序和共享库。如果不更改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;
}
hello.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已经存在,但连接器出于某种原因没有使用它。
显然,在Android上动态链接器工作得很好(带有LD_LIBRARY_PATH和它的不同RPATH)
我做错了什么吗?
我是否遗漏了一些显而易见的东西?
在我的例子中,RPATH有两个目录(.:/data/data/testlib/lib),其中一个(.)就足够了。
这个例子中没有Java。它没有被使用,也不需要为该项目使用。
基本上,我正在寻找一种标准的方式来从“我的目录”加载共享库,而不必更改LD_LIBRARY_PATH(有时是不可能的)或使用包装器来dlopen所有所需的库。
gcc -olibfirst.so first.c -fPIC -shared
gcc -ohello hello.c -lfirst -L.
./hello
./hello: error while loading shared libraries: libfirst.so: cannot open shared object file: No such file or directorygcc -ohello hello.c -lfirst -L. -Wl,-rpath,.
./hello
Hello, world!抱歉,不知道如何优雅地格式化评论。 - Same old guy...readelf --all hello
`... 程序头: 类型 偏移量 虚拟地址 物理地址 ... INTERP 0x0000000000000200 0x0000000000400200 0x0000000000400200 [请求程序解释器:/lib64/ld-linux-x86-64.so.2] ...偏移量为0x808的动态段包含22个条目: 标签 类型 名称/值 0x0000000000000001 (NEEDED) 共享库: [libfirst.so] 0x0000000000000001 (NEEDED) 共享库: [libc.so.6] 0x000000000000000f (RPATH) 库rpath: [.]` - Same old guy...LOCAL_LDFLAGS
吗? - Olaf Dietsche