1. 搭建测试环境
将test1
(参考linux c文件生成so文件并调用示例)文件夹中的add.c
,add.h
,main.c
复制到test3
文件夹中,文件列表如下:
luo@luo-desktop:~/test3$ ls
add.c add.h main.c
2. 交叉编译
执行以下命令,交叉编译add.c文件为libadd.so文件:
luo@luo-desktop:~/test3$ arm-linux-gnueabihf-gcc add.c -fPIC -shared -o libadd.so
luo@luo-desktop:~/test3$ ls
add.c add.h libadd.so
luo@luo-desktop:~/test3$ file libadd.so
libadd.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=82c8a79ce0e4ecd1b9564000ccd2473294286cf8, with debug_info, not stripped
执行以下命令,交叉编译main.c文件为main可执行文件:
luo@luo-desktop:~/test3$ arm-linux-gnueabihf-gcc main.c -L. -ladd -o main
luo@luo-desktop:~/test3$ ls
add.c add.h libadd.so main main.c
luo@luo-desktop:~/test3$ file main
main: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=7e00631b728338509951f8f06c29e4a09a9de6ef, with debug_info, not stripped
3. 推送至开发板运行测试
将main
,libadd.so
,文件推送到开发板/root
目录,然后执行以下命令测试:
root@sipeed:~$ ls
libadd.so main
root@sipeed:~$ ./main
/bin/sh: ./main: not found
发现运行不了。执行以下命令查找原因:
root@sipeed:~$ ldd main
/lib/ld-linux-armhf.so.3 (0xb6f2f000)
Error loading shared library libadd.so: No such file or directory (needed by main)
libc.so.6 => /lib/ld-linux-armhf.so.3 (0xb6f2f000)
Error relocating main: add: symbol not found
指示找不到libadd.so
文件,那将该文件路径加入LD_LIBRARY_PATH
变量,继续测试:
root@sipeed:~$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
root@sipeed:~$ ldd main
/lib/ld-linux-armhf.so.3 (0xb6f0b000)
libadd.so => /root/libadd.so (0xb6efa000)
libc.so.6 => /lib/ld-linux-armhf.so.3 (0xb6f0b000)
root@sipeed:~$ ./main
/bin/sh: ./main: not found
这下能找到libadd.so文件了,但还是不行。继续查找原因,发现/lib/ld-linux-armhf.so.3
这个文件也没有:
root@sipeed:~$ ls /lib/ld-linux-armhf.so.3
ls: /lib/ld-linux-armhf.so.3: No such file or directory
于是去ubuntu系统中找,结果在交叉编译链的目录中找到了这个文件:
luo@luo-desktop:/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf$ find -name ld-linux-armhf*
./arm-linux-gnueabihf/libc/lib/ld-linux-armhf.so.3
然后把这个文件推送到开发板的/lib
目录下,继续测试:
root@sipeed:~$ ls /lib/ld-linux-armhf.so.3
/lib/ld-linux-armhf.so.3
root@sipeed:~$ ./main
./main: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory
报错说每找到libc.so.6
这个文件,这应该是个链接文件,链接到ld-linux-armhf.so.3
文件上,所以尝试在/lib目录下新建libc.so.6
文件指向ld-linux-armhf.so.3
:
root@sipeed:~$ ln -s /lib/ld-linux-armhf.so.3 /lib/libc.so.6
root@sipeed:~$ ll /lib/libc.so.6
lrwxrwxrwx 1 root root 24 Jan 10 03:41 /lib/libc.so.6 -> /lib/ld-linux-armhf.so.3
root@sipeed:~$ ./main
./main: relocation error: libadd.so: symbol __cxa_finalize, version GLIBC_2.4 not defined in file libc.so.6 with link time reference
结果还是报错。最终确定原因是交叉编译工具链导致的,解决办法就是使用开发板官方提供的交叉编译工具链进行编译。最后运行成功:
root@sipeed:~$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`
root@sipeed:~$./main
hello world 3
root@sipeed:~$ ldd main
/lib/ld-musl-armhf.so.1 (0xb6f03000)
libadd.so => /root/libadd.so (0xb6ef2000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb6ed8000) libc.so => /lib/ld-musl-armhf.so.1 (0xb6f03000)