将test1(参考linux c文件生成so文件并调用示例)文件夹中的add.c,add.h,main.c复制到test3文件夹中,文件列表如下:
luo@luo-desktop:~/test3$ ls add.c add.h main.c2. 交叉编译
执行以下命令,交叉编译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 stripped3. 推送至开发板运行测试
将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)



