android 加载动态库不成功,Android动态链接库无法解析主程序的符号

我可以成功地在C中创建一个链接到库的程序,并且能够调用该库的函数.如果该库从主程序调用函数,则会出现错误:

root@android:/data/local/tmp # ./helloworld

link_image[1966]: 637 could not load needed library 'libhello.so' for './helloworld' (reloc_library[1315]: 637 cannot locate 'crossfunction'...) CANNOT LINK EXECUTABLE

代码在两个C文件中,我还包括Makefile. hello.c是保存函数hello的库,由main.c(主程序)调用.函数hello尝试调用函数crossfunction并且在android中不起作用(在Linux中它运行得非常好).我怀疑来自android链接器,但到目前为止还没有证据(请参阅https://android.googlesource.com/platform/bionic/+/froyo-release/linker/README.TXT).

另一个好的提示可能是rehellf输出中的NOTYPE赋值,用于libhello.so文件中的交叉函数.请看下面.

5: 00000000 0 NOTYPE GLOBAL DEFAULT UND crossfunction

可能在编译器标志或链接器标志中的任何提示?

::::::::::::::

main.c

::::::::::::::

#include

extern void hello(const char* name);

int main(void) {

hello("World!");

}

void crossfunction(void) {

printf("This is called from the library\n");

}

::::::::::::::

hello.c

::::::::::::::

#include

extern void crossfunction(void);

static char *s;

void hello(const char* name) {

s = "my second name";

printf("Hello %s %s!\n", s, name);

crossfunction();

}

这是Makefile:

OBJECTS=main.o

LIB=libhello.so

LIBOBJ=hello.o

TARGET=helloworld

TARGETDIR=/data/local/tmp

CC=agcc

.PHONY: all install run clean distclean

all: $(TARGET) $(LIB)

hello.o: hello.c Makefile

$(CC) $(CFLAGS) -c -o hello.o hello.c

$(TARGET): $(OBJECTS) $(LIB) Makefile

$(CC) -Wl,-rpath=$(TARGETDIR) -lhello -L . -o $(TARGET) $(OBJECTS)

$(LIB): $(LIBOBJ) Makefile

$(CC) -shared -o $(LIB) $(LIBOBJ)

install: $(TARGET)

adb push $(TARGET) $(TARGETDIR)/$(TARGET)

adb push $(LIB) $(TARGETDIR)/$(LIB)

run: install

adb shell "export LD_LIBRARY_PATH=$(TARGETDIR); $(TARGETDIR)/$(TARGET) "

我查看了readelf位,但我发现.dynsym,.rel.plt和.symtab部分没有实质性差异.

对于helloworld

Relocation section '.rel.plt' at offset 0x33c contains 3 entries:

Offset Info Type Sym.Value Sym. Name

0000954c 00000416 R_ARM_JUMP_SLOT 00008368 hello

00009550 00000516 R_ARM_JUMP_SLOT 00008374 puts

00009554 00000816 R_ARM_JUMP_SLOT 00008380 __libc_init

Symbol table '.dynsym' contains 16 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 00000000 0 NOTYPE LOCAL DEFAULT UND

1: 000083b0 32 FUNC GLOBAL DEFAULT 7 crossfunction

2: 00008450 0 NOTYPE GLOBAL DEFAULT ABS __exidx_end

3: 00009558 0 NOTYPE GLOBAL DEFAULT ABS _bss_end__

4: 00008368 0 FUNC GLOBAL DEFAULT UND hello

5: 00008374 0 FUNC GLOBAL DEFAULT UND puts

...

Symbol table '.symtab' contains 62 entries:

Num: Value Size Type Bind Vis Ndx Name

...

41: 000083b0 32 FUNC GLOBAL DEFAULT 7 crossfunction

42: 00008450 0 NOTYPE GLOBAL DEFAULT ABS __exidx_end

43: 00009558 0 NOTYPE GLOBAL DEFAULT ABS _bss_end__

44: 00008368 0 FUNC GLOBAL DEFAULT UND hello

45: 00008374 0 FUNC GLOBAL DEFAULT UND puts

...

55: 00008390 32 FUNC GLOBAL DEFAULT 7 main

...

而对于libhello.so

Relocation section '.rel.plt' at offset 0xae8 contains 7 entries:

Offset Info Type Sym.Value Sym. Name

000032cc 00000516 R_ARM_JUMP_SLOT 00000000 crossfunction

000032d0 00000616 R_ARM_JUMP_SLOT 00000000 printf

000032d4 00000f16 R_ARM_JUMP_SLOT 00000000 __cxa_begin_cleanup

000032d8 00001516 R_ARM_JUMP_SLOT 00000000 memcpy

000032dc 00001f16 R_ARM_JUMP_SLOT 00000000 abort

...

Symbol table '.dynsym' contains 64 entries:

Num: Value Size Type Bind Vis Ndx Name

0: 00000000 0 NOTYPE LOCAL DEFAULT UND

...

5: 00000000 0 NOTYPE GLOBAL DEFAULT UND crossfunction

6: 00000000 0 FUNC GLOBAL DEFAULT UND printf

...

19: 00000b88 100 FUNC GLOBAL DEFAULT 7 hello

21: 00000000 0 FUNC GLOBAL DEFAULT UND memcpy

...

Symbol table '.symtab' contains 138 entries:

Num: Value Size Type Bind Vis Ndx Name

25: 00000000 0 FILE LOCAL DEFAULT ABS hello.c

79: 00000000 0 NOTYPE GLOBAL DEFAULT UND crossfunction

80: 00000000 0 FUNC GLOBAL DEFAULT UND printf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值