我已经在Ubuntu 12.04上构建了一个应用程序,并尝试在嵌入式系统上运行它。我在我的开发机器上运行了apt-cache show libc6,它显示(在其他东西中)
Package: libc6
Priority: required
Section: libs
Architecture: i386
Source: eglibc
Version: 2.15-0ubuntu10
Replaces: belocs-locales-bin, libc6-i386
Provides: glibc-2.13-1, libc6-i686嵌入式设备上存在的libc6版本为2.8.90。在设备上的\lib目录中,我有2个库
libc-2.8.90.so
libc.so.6当我将我的应用程序复制到嵌入式设备上时,我得到以下错误
/usr/lib/libc.so.6: version `GLIBC_2.15` not found (required by ./ServerSocketApp)我知道,如果可能的话,当我在我的开发机器上构建应用程序时,我需要强制它链接到与嵌入式设备上存在的相同版本的libc6。我的问题是我根本不知道怎么做。现在,我找到的任何答案对我来说都是没有意义的。是否有需要传递给g++的选项才能将此链接到版本2.8.90 ??
在绝望中,我在想,有没有可能将我开发的机器上的libc复制到嵌入式设备上,以取代已经存在的东西,并希望得到最好的结果?我在网上似乎找不到任何简单的文档来解释你是如何做到这一点的,所以任何建议都将是非常受欢迎的,因为我在这里撕扯我的头发。
发布于 2012-07-10 02:25:16
这从根本上是不正确的。虽然您可以破解出一种在旧libc中链接的方法,但问题出在您的环境设置上。
当您为嵌入式系统开发应用程序时。您可以在主机上执行此操作。通常,主机和嵌入式设备不在同一架构上。例如,您的主机通常是在x86上运行的台式机/笔记本电脑,而嵌入式系统可能在ARM上。如果你碰巧和你的嵌入式设备在同一架构上,那纯粹是巧合。标准实践环境设置仍应遵循:
在嵌入式architecture
编译应用程序的所有库
如果你这样设置的话。开发将会很容易。您将能够设置简单、干净的make文件来构建应用程序,然后只需将二进制文件scp到嵌入式系统并运行即可。
发布于 2012-07-10 00:57:27
好的,这里有一个有点长的解释,但是要小心。我仍然强烈建议您设置chrooted环境,使其与嵌入式设备上可用的环境相匹配,并在构建过程的最后阶段使用它。
您应该了解动态链接的ELF可执行文件是如何加载和执行的。有一种称为运行时链接编辑器(RTLD)的东西,也称为动态链接器,它负责加载所有必要的动态链接库,修复重新定位等。在安装了glibc2的32位Linux系统上,动态链接器的名称是/lib/ld-linux.so.2;在安装了glibc2的64位Linux系统上,动态链接器的名称是/lib64/ld-linux-x86-64.so.2。动态链接器是与glibc2库紧密耦合的,通常只能处理该库的匹配版本。此外,链接器将它的路径硬编码到可执行文件中(通常是ld,由编译器隐式调用以进行链接)。您只需执行ldd some_elf_executable即可轻松检查最后一条语句的有效性--运行时链接编辑器会显示完整路径:
$ ldd some_elf_executable
linux-vdso.so.1 => (0x00007fffab59e000)
libm.so.6 => /lib64/libm.so.6 (0x0000003648400000)
libc.so.6 => /lib64/libc.so.6 (0x0000003648800000)
/lib64/ld-linux-x86-64.so.2 (0x0000003648000000) <--- the RTLD为了生成动态链接的可执行文件,该文件使用的glibc2版本与要运行该可执行文件的系统上安装的版本不同,您应该使用以下一组选项将代码链接到ld
-rpath=/path/to/newer/libs -当尝试解析库依赖关系时,它指示动态链接器首先搜索/path/to/newer/libs。/path/to/newer/libs应与您在嵌入式device-rpath-link=/path/to/newer/libs上复制较新glibc2版本的路径相匹配-此选项指示链接器(而不是动态链接器)在链接时解析共享库之间的依赖关系时使用/path/to/newer/libs -这在您的/path/to/newer/libs中通常不是必需的-此选项将覆盖嵌入到可执行中的RTLD的路径
向ld提供这些选项的方法通常是通过GCC的-Wl选项。
-rpath=/path/to/newer/libs变成:
-Wl,-rpath,/path/to/newer/libs(请注意,,替换了= )
--dynamic-linker=/path/to/newer/libs/ld-linux.so.2变成:
-Wl,--dynamic-linker,/path/to/newer/libs/ld-linux.so.2您应该将开发系统中的/lib/ld-linux.so.2复制到嵌入式设备上的/path/to/newer/libs/。您还应该复制libc.so.6、数学库libm.so.6和可执行文件使用的或可能间接加载的所有其他库。请注意,libc.so.6和libm.so.6实际上是指向实际库的符号链接,其名称类似于libc-2.<version>.so。您应该复制这些库文件并创建适当的符号链接,以使每个人都满意。
发布于 2012-07-09 23:16:53
您可能会幸运地使用LSB SDK (http://www.linuxfoundation.org/collaborate/workgroups/lsb/download)进行编译,它限制了可执行文件可用的符号。
https://stackoverflow.com/questions/11397670
复制相似问题