| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> glibc 知:构建和测试 -> 正文阅读 |
|
[系统运维]glibc 知:构建和测试 |
文章目录1. 前言构建和测试glibc的wiki主页为:https://sourceware.org/glibc/wiki/Testing/Builds 本章将介绍glibc的构建和使用…… 2. 构建我们知道一般linux系统中都会存在已有的glibc库,现在我们要构建自己的glibc库,那新构建的glibc会不会破坏已有的glibc呢?如果破坏了将会带来什么危害呢? 这里我们测试glibc构建,然后并不将它安装到系统路径下,在系统上安装新的glibc可是一件非常大胆的事情,弄不好就会把系统环境破坏了,所以我们最好不要这么做。 2.1. 只构建不安装只构建不安装,可以执行标准的configure和make,例如:
切记:不要执行 通过使用前缀/usr来创建glibc,它将加载和使用来自标准位置的所有配置文件。前缀/usr被认为是系统glibc的正确前缀。更高级的用户会注意到前缀实际上是 glibc ABI 的一部分。 最后,如果您想使用一组替代的 Linux 内核头文件进行构建,您将需要使用 测试如下:
修复configure中出现的所有错误,直到执行成功。成功后,在构建目录下会生成Makefile,之后执行make进行构建即可,构建时间比较漫长……(读者可以尝试用make -jn来并行构建(n表示任务数)) 2.2. 构建并安装上面我们提到最好不要在系统中安装新的glibc,是指将glibc安装到系统默认环境中。如果我们将其安装到用户自定义的临时目录中,就不会破坏系统中的glibc了,本节将简述如何将构建的glibc安装到临时目录。 先做带–prefix=/usr目录的configure,然后make和make install DESTDIR=xxx(其中xxx即为用户指定的临时安装目录,将GNU标准变量DESTDIR设置为某个临时安装目录xxx),例如:
基于上节的构建结果,进行安装测试,如下所示: 然后你将需要一组 linux 内核头文件:
这里可以从官网下载linux压缩包,以linux-5.13.5为例,测试如下: 最后,您将需要 gcc 的帮助库来消除(cancellation):
测试如下: 3. 测试3.1. 正常编译应用,在新glibc下运行编译您的测试程序,并使用您构建的新加载程序调用它。这也是make check运行测试的方式。注意:如果被测试的可执行文件位于当前目录中,请不要忘记在名称前使用./。 在构建目录中使用testrun.sh,例如:
或者像这样手动执行此操作:
请注意,这样的编译不使用新的 C 运行时对象,即glibc 提供的crt1.o、crti.o和crtn.o。对这些对象所做的更改需要更复杂的编译,有关详细信息,请参阅后面的说明。使用-Wl,-Map,linker.map 进行编译将准确显示最终链接中使用了哪些对象。 下面以hello.c为例进行测试:
编译,执行如下: 3.2. 基于glibc构建树进行编译应用如果您想轻松调试应用程序但尚未安装 glibc,请使用此方法。
请注意,这样的编译不使用glibc 提供的新头文件或 C 运行时对象,即crt1.o、crti.o和crtn.o。对头文件或对象所做的更改需要更复杂的编译,有关详细信息,请参阅后面的说明。使用-Wl,-Map,linker.map 进行编译将准确显示最终链接中使用了哪些对象。 测试如下: 3.3. 基于glibc安装位置进行编译应用请注意,安装的 glibc 是一个不完整的 C 运行时。为了完成 C 运行时,您可能需要复制与您正在使用的编译器匹配的其他头文件,因为使用–sysroot会将它们的查找限制为sysroot。 如果您想轻松调试应用程序,请使用此方法。 编译您的测试程序并为 gcc 提供一些额外的选项以使用安装目录,并为链接器提供一些选项以设置共享库搜索路径和动态链接器。最好使用“readelf”验证动态链接器的位置,使用“ldd”验证库搜索路径。(请参阅加载器提示和技巧)
构建的应用程序现在将始终使用您编译它的路径中的动态加载器和库。 如果您的静态链接器缺少 sysroot 支持,您可以试试这个:
您将需要在使用lib的 32 位系统或 64 位系统(如 Ubuntu)上使用lib。 测试如下: 3.4. 所需的gdb设置如果程序是多线程的,或者如果要将环境变量传递给程序,则使用新的 glibc 构建调试程序需要几个额外的步骤。glibc 构建系统为此目的提供了一个辅助脚本,因此,在运行make和make check 之后: 在构建目录中使用debugglibc.sh例如
测试如下: 3.4.1. 线程设置需要采取一个特殊步骤来调试使用带有 gdb 的新 glibc 构建的线程应用程序。必须显式设置线程数据库库。thread db 库允许调试器检查各种内部库状态(包括线程),并且是线程调试所必需的。调试器不能轻易猜出线程数据库库的正确版本和位置。如果您安装了 glibc,调试器通常会发现libthread_db.so没有任何问题,但是如果您没有安装 glibc,那么您在尝试使用系统库调试线程代码时肯定会遇到问题。因此,确切地指定在何处搜索线程数据库库始终是最安全的。 调试前在 gdb 中执行:
3.4.2. 环境设置将环境变量传递给应用程序进行调试并不总是像您预期的那样直接。某些环境变量可能会对 gdb 用于启动应用程序的 shell 产生负面影响。在这些情况下,您应该使用exec-wrapper来确保只有被调试的应用程序设置了预期的环境变量。 调试前在 gdb 中执行:
3.4.3. 调试测试用例在 glibc 中运行的测试用例(即通过make check)通常需要以特定于 glibc 的方式运行,有些需要在测试容器内运行。为了调试这些,glibc 提供了一个特殊的 makefile 目标:
当测试以这种方式运行时,它会在运行测试主体之前暂停,并打印通过 gdb 附加到它的指令。 请注意,省略WAIT_FOR_DEBUGGER=1部分将简单地重新运行单个指定的测试. 4. 后语构建和测试中,还剩下“使用全新的文件构建”一节没有介绍,该节稍微复杂,感兴趣的读者可以自行解锁! |
|
|
上一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 16:26:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |