我正在尝试开发一个在嵌入式 Linux 安装上运行的应用程序。它附带的 libc 版本比我的开发机器上的版本旧。如果我要在开发计算机上创建 chroot 环境,以 chroot 环境镜像设备的方式从嵌入式设备复制库,然后构建应用程序,在设备上运行是否安全?我的开发机器和设备都是 x86 32 位,所以我认为我不需要交叉编译。
另外,我编写的应用程序是否需要链接到其他库(设备上不存在),我可以安全地在 chroot 中的开发计算机上构建这些库,然后将它们复制到设备以进行应用程序部署吗?
从我对此主题所做的所有阅读来看,确保所有内容正确链接在一起的唯一方法是在设备上实际构建应用程序,但这不是一个选项,因为它是最小安装,并且不附带 gcc 安装。
答案1
这通常会起作用。我只是想尝试一下,但您需要注意以下几点:
构建时,需要针对目标的 CPU 架构和功能构建二进制文件。鉴于它们都是 x86,这将有很大帮助,但您仍然需要小心使用 sse3 等处理器功能。如果您构建的二进制文件利用了目标安装中缺少的功能,那么它会获胜不工作。
您的构建系统的内核可能会对您的 chroot 环境的行为产生一些影响。您不能对 chroot 与主机系统使用不同的内核,因此您可能会遇到两者之间的差异。应用程序通常最终通过 libc 与内核进行通信,它提供了一个标准接口,可以帮助防止此类问题。
您的 libc 需要在某种程度上与您的内核兼容。您的嵌入式系统中的 libc 可能与您的内核不完全兼容,具体取决于接口的更改;但是,如果 libc 早于您的内核,则这不太可能成为问题(旧的内核接口更有可能保留以支持旧的二进制文件)。
您的主机系统的服务将对您的嵌入式系统可见。这对于任何 chroot 来说都很常见,因为它们共享进程表、网络接口等。
对于“附加库”,您可以使用静态链接将它们链接到您的应用程序。然后您可以避免将库部署到设备。你的旅费可能会改变。
您可以考虑使用虚拟机来执行此操作。它不一定会消除所有问题(例如处理器功能/标志),但您可以拥有一个与您的嵌入式系统更紧密匹配的环境。也就是说,您可以使用相同的内核,运行相同的引导过程,避免受到主机服务的污染......
请注意,如果您在 chroot 内设置构建工具链,您可能需要考虑如何将新文件复制回嵌入式系统;您可能不想复制工具链文件(gcc 等)。
尝试设置它并编写一个测试应用程序,构建一些库或其他内容,然后看看它们在移动到嵌入式系统时的工作情况如何。