Linux不能finddynamic链接的应用程序

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

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

-/bin/sh: helloworld: not found 

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

这里发生了什么?

Solutions Collecting From Web of "Linux不能finddynamic链接的应用程序"

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

我知道有那里的图书馆,我可以运行非静态应用程序!

只是一个除了上面澄清,如果任何身体面临同样的问题..正如我上面看到的问题刚刚..

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 find . -name libc.so找到libc和libm之后,创建(您的rootfs)/ lib目录并将其复制到那里。 这些文件可能是符号链接到其他文件,所以一定要把它们都收集起来。 下一个要得到的文件是动态加载器,通常称为ld-linux-,它也与libc.so. *一起驻留在lib目录中。 将其复制到/ lib目录。 你的系统现在拥有所有的共享库和加载器,所以BusyBox可以运行

解决这个问题的方法是将uClibc库复制到可以完成的目标文件系统中,步骤如下:

1. uClibc库位于“buildroot / output / target / lib /”文件夹中。 2.我们必须将这个文件夹中的所有文件复制到目标文件系统的“/ lib”文件夹中。 3.“copy”可以通过“scp”命令来完成。 sudo scp -r PATH_TO_BUILDROOT / output / target / lib / * TARGET_USERNAME @TARGET_IP:/ lib

这样做后,所有的应用程序将正常运行。