如何在 Intel x86 服务器上构建 IBM PowerLinux 应用程(3)

除了性能之外,开发人员可能还有其他与 toolchain 交叉编译器的使用相关的问题。本节回答了与功能和调试交叉编译的二进制程序的能力相关的问题。这些问题是:

交叉编译器构建的二进制程序,在功能上是否与原生构建的可执行程序兼容?

交叉编译的二进制程序能否在 PowerLinux 服务器上进行调试?

接下来的两个简单用例有助于回答这些问题。

用例 1:将一个原生构建的 httpd 的一个或多个共享库替换为使用 toolchain 交叉编译器构建的共享库。查看原生构建的 httpd 是否仍能正常运行。

用例 2:在 PowerLinux 服务器上,将一个正在运行的进程附加一个调试器。该进程是一个从 x86 服务器构建的交叉编译的二进制可执行程序。设置一个断点,设置源代码目录,并执行一组函数。

用例 1:功能测试

以下是我在用例 1 中遵循的操作说明:

将原生构建的 httpd 安装在 /home/usr/local 中。

对 /home/use/local/bin/httpd 二进制程序运行 ldd 实用程序,以显示它的共享二进制依赖项。您可以注意到,libaprutil-1.so.0 和 libapr-1.so.0 都位于 /home/usr/local/lib 中。这些库是 httpd 需要的原生编译的库的一部分。

[root@localhost lib]# ldd ../../bin/httpd linux-vdso64.so.1 => (0x00000fffa1140000) libaprutil-1.so.0 => /home/usr/local/apr/lib/libaprutil-1.so.0 (0x00000fffa10c0000) libapr-1.so.0 => /home/usr/local/apr/lib/libapr-1.so.0 (0x00000fffa1060000) librt.so.1 => /opt/at7.0-5-rc1/lib64/power7/librt.so.1 (0x00000fffa1040000) libcrypt.so.1 => /opt/at7.0-5-rc1/lib64/power7/libcrypt.so.1 (0x00000fffa0ff0000) libpthread.so.0 => /opt/at7.0-5-rc1/lib64/power7/libpthread.so.0 (0x00000fffa0fb0000) libdl.so.2 => /opt/at7.0-5-rc1/lib64/power7/libdl.so.2 (0x00000fffa0f90000) libc.so.6 => /opt/at7.0-5-rc1/lib64/power7/libc.so.6 (0x00000fffa0da0000) /opt/at7.0-5-rc1/lib64/ld64.so.1 => /lib64/ld64.so.1 (0x00000000267a0000)

删除共享库 libaprutil-1.so.0 和 libapr-1.so.0。

将交叉编译的库 libaprutil-1.so.0 和 libapr-1.so.0 复制到 /tmp/usr/local/lib 中。

将 /tmp/usr/local/lib 包含在 LD_LIBRARY_PATH 中。

# cd /home/usr/local/apr/lib # rm libaprutil-1.so.0 # rm libapr-1.so.0 # export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/usr/local/lib

再次运行 ldd 实用程序,可以看到 httpd 现在使用了 /tmp/usr/local/lib 中的库。

[root@localhost lib]# ldd ../../bin/httpd linux-vdso64.so.1 => (0x00000fff951a0000) libaprutil-1.so.0 => /tmp/usr/local/apr/lib/libaprutil-1.so.0 (0x00000fff95150000) libapr-1.so.0 => /tmp/usr/local/apr/lib/libapr-1.so.0 (0x00000fff950f0000) librt.so.1 => /opt/at7.0-5-rc1/lib64/power7/librt.so.1 (0x00000fff950d0000) libcrypt.so.1 => /opt/at7.0-5-rc1/lib64/power7/libcrypt.so.1 (0x00000fff95080000) libpthread.so.0 =>/opt/at7.0-5-rc1/lib64/power7/libpthread.so.0 (0x00000fff95040000) libdl.so.2 => /opt/at7.0-5-rc1/lib64/power7/libdl.so.2 (0x00000fff95020000) libc.so.6 => /opt/at7.0-5-rc1/lib64/power7/libc.so.6 (0x00000fff94e30000) libexpat.so.0 => /tmp/usr/local/apr/lib/libexpat.so.0 (0x00000fff94df0000) /opt/at7.0-5-rc1/lib64/ld64.so.1 => /lib64/ld64.so.1 (0x0000000022730000)

启动应用程序,以查看它是否能像正常应用程序一样运行。

# cd /home/usr/local/bin # ./apachectl start # ps –ef | grep http root 11022 1 0 15:41 ?00:00:00 /home/usr/local/bin/httpd -k start daemon 11023 11022 0 15:41 ?00:00:00 /home/usr/local/bin/httpd -k start daemon 11024 11022 0 15:41 ?00:00:00 /home/usr/local/bin/httpd -k start daemon 11025 11022 0 15:41 ?00:00:00 /home/usr/local/bin/httpd -k start daemon 11111 11022 0 15:41 ?00:00:00 /home/usr/local/bin/httpd -k start

在浏览器中打开运行 httpd 进程的 PowerLinux 服务器,查看浏览器上是否显示了以下消息:

它起作用了!

在此场景中,我们结合使用了一个原生编译的库和交叉编译的库。交叉编译的库是使用 ppc64 架构选项构建的。在此用例中我们可以证明,我们可以在 PowerLinux 服务器上结合使用交叉编译的库和原生编译的可执行程序。

用例 2:调试

在第二个用例中,我们尝试证明交叉编译的可执行程序可以在 PowerLinux 服务器上进行调试。以下是我在用例 2 中遵循的操作说明:

使用 gdb,附加到 httpd 进程。确保使用的 httpd 版本是 toolchain 交叉编译器在 x86 平台上构建的版本。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cf58afa05233967f4786f553f252ed15.html