我有一个运行 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 可以运行。`
我找到了答案。我犯了一个简单的错误,就是没有将 uClibc 库放在我的文件系统上。
我知道那里有库,我可以运行非静态应用程序!
此问题的解决方案是将 uClibc 库复制到目标文件系统中,可以按照以下步骤完成:
1.uClibc 库位于“buildroot/output/target/lib/”文件夹中。2.我们必须将该文件夹中的所有文件复制到目标文件系统的“/lib”文件夹中。3.复制的事情可以通过“scp”命令来完成。sudo scp -r PATH_TO_BUILDROOT/output/target/lib/* TARGET_USERNAME@TARGET_IP:/lib
完成此操作后,所有应用程序都将正常运行。