Linux无法找到动态链接的应用程序

时间:2013-09-19 15:18:20

标签: linux dynamic static kernel busybox

我有一个运行Linux Kernel 3.10和Busybox的嵌入式系统。

如果我交叉编译(由buildroot构建的工具链,所以使用uclibc)没有-static标志的程序。它不会运行。

-/bin/sh: helloworld: not found

如果我使用-static标志编译我的代码。它通常会运行并输出HelloWorld

这是怎么回事?

3 个答案:

答案 0 :(得分:1)

只是上面的一个补充,澄清了是否有任何身体面临同样的问题..正如我刚才看到的问题..

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可以运行。

答案 1 :(得分:0)

我找到了答案..我犯了一个简单的错误,就是不把uClibc库放在我的文件系统上。

我知道那里有库,我可以运行非静态应用程序!

答案 2 :(得分:0)

此问题的解决方案是将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

执行此操作后,所有应用程序都将正常运行。