【交叉编译】linux c文件生成so文件并调用示例

1. 搭建测试环境

test1(参考linux c文件生成so文件并调用示例)文件夹中的add.cadd.hmain.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. 推送至开发板运行测试

mainlibadd.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)
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值