我有一个运行 Linux Kernel 3.10 和 Busybox 的嵌入式系统。
如果我交叉编译(由 buildroot 构建工具链,因此使用 uclibc)一个没有 -static 标志的程序。它不会运行。
-/bin/sh: helloworld: not found
如果我使用 -static 标志编译我的代码。它会正常运行并输出HelloWorld
这里发生了什么?
只是对上面的补充,澄清是否有人面临同样的问题..正如我刚才看到的上面的问题..
If you compile busybox with statically.Then no need to worry about shared library. But if you compiled busy box with dynamically then your toolchain plays important role in rootfs. here you need to copy libraries of toolchain to rootfs /lib folder .
只需键入以下命令即可知道需要复制哪些库。
strings _install/bin/busybox | grep ^lib
显示应保存在 rootfs 的 /lib 中的列表库。
该命令表示:“从文件中获取所有字符串,并且仅显示以 lib 开头的行。”程序ldd无法使用,因为该程序已经交叉编译,无法在开发主机上运行。这些文件应该从工具链的 sysroot 目录中获取。大多数现代工具链都配置有 sysroot,该目录包含工具链中可能出现在工具链目标系统的根文件系统上的文件。要检查您的工具链是否支持 sysroot,请尝试以下操作:
$ arm-linux-gcc -print-sysroot
/arm-unknown-linux-gnueabi/bin/arm-linux-gcc 如果这是有效路径,则应从此处复制文件。如果没有显示路径,则使用find查找 sysroot目录,或者使用find查找libc.so:
$ find . -name libc.so
找到 libc 和 libm 后,创建(您的 rootfs)/lib 目录并将它们复制到那里。这些文件可能是其他文件的符号链接,因此请务必将它们全部收集起来。下一个要获取的文件是动态加载程序,通常称为 ld-linux-,它也与 libc.so.* 一起驻留在 lib 目录中。将其复制到 /lib 目录。您的系统现在拥有所有共享库和加载程序,因此 BusyBox 可以运行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)