TLPI 第41章 练习:Fundamentals of Shared Libraries

发布时间:2026/10/10 14:27:56

TLPI 第41章 练习:Fundamentals of Shared Libraries 笔记和练习博客总目录见开始读TLPI。41-1尝试分别使用和不使用-static选项编译同一个程序对比动态链接 C 库与静态链接 C 库两种方式生成可执行文件的大小差异。根据gcc(1)-static的说明为-staticOn systems that support dynamic linking, this overrides -pie and prevents linking with the shared libraries. On other systems, this option has no effect.此练习需要预先安装静态版本的libc。$sudoyuminstallglibc-static Last metadata expiration check:0:56:41 ago on Thu 08 Oct202605:38:46 AM UTC. Dependencies resolved.Package Architecture Version Repository SizeInstalling: glibc-static x86_642.34-275.0.1.el9_8 ol9_codeready_builder1.5M Upgrading: glibc x86_642.34-275.0.1.el9_8 ol9_baseos_latest2.0M glibc-common x86_642.34-275.0.1.el9_8 ol9_baseos_latest334k glibc-devel x86_642.34-275.0.1.el9_8 ol9_appstream63k glibc-gconv-extra x86_642.34-275.0.1.el9_8 ol9_baseos_latest1.8M glibc-headers x86_642.34-275.0.1.el9_8 ol9_appstream925k glibc-langpack-de x86_642.34-275.0.1.el9_8 ol9_baseos_latest779k glibc-langpack-en x86_642.34-275.0.1.el9_8 ol9_baseos_latest973k glibc-langpack-es x86_642.34-275.0.1.el9_8 ol9_baseos_latest1.1M glibc-langpack-fr x86_642.34-275.0.1.el9_8 ol9_baseos_latest728k glibc-langpack-zh x86_642.34-275.0.1.el9_8 ol9_baseos_latest2.3M Installing dependencies: libxcrypt-static x86_644.4.18-3.el9 ol9_codeready_builder102k Transaction SummaryInstall2Packages Upgrade10Packages Total download size:12M Is this ok[y/N]: y Downloading Packages:(1/12): glibc-static-2.34-275.0.1.el9_8.x86_64.rpm1.5MB/s|1.5MB 00:00(2/12): glibc-common-2.34-275.0.1.el9_8.x86_64.rpm2.4MB/s|334kB 00:00(3/12): glibc-2.34-275.0.1.el9_8.x86_64.rpm1.7MB/s|2.0MB 00:01(4/12): glibc-langpack-de-2.34-275.0.1.el9_8.x86_64.rpm3.2MB/s|779kB 00:00(5/12): glibc-gconv-extra-2.34-275.0.1.el9_8.x86_64.rpm4.3MB/s|1.8MB 00:00(6/12): glibc-langpack-en-2.34-275.0.1.el9_8.x86_64.rpm4.1MB/s|973kB 00:00(7/12): glibc-langpack-fr-2.34-275.0.1.el9_8.x86_64.rpm7.2MB/s|728kB 00:00(8/12): glibc-langpack-es-2.34-275.0.1.el9_8.x86_64.rpm4.1MB/s|1.1MB 00:00(9/12): glibc-devel-2.34-275.0.1.el9_8.x86_64.rpm904kB/s|63kB 00:00(10/12): glibc-langpack-zh-2.34-275.0.1.el9_8.x86_64.rpm7.5MB/s|2.3MB 00:00(11/12): glibc-headers-2.34-275.0.1.el9_8.x86_64.rpm3.6MB/s|925kB 00:00(12/12): libxcrypt-static-4.4.18-3.el9.x86_64.rpm43kB/s|102kB 00:02 --------------------------------------------------------------------------------------------------------------- Total5.2MB/s|12MB 00:02 Running transaction check Transaction check succeeded. Running transactiontestTransactiontestsucceeded. Running transaction Preparing:1/1 Upgrading:glibc-common-2.34-275.0.1.el9_8.x86_641/22 Upgrading:glibc-gconv-extra-2.34-275.0.1.el9_8.x86_642/22 Running scriptlet: glibc-gconv-extra-2.34-275.0.1.el9_8.x86_642/22 Upgrading:glibc-langpack-de-2.34-275.0.1.el9_8.x86_643/22 Upgrading:glibc-langpack-en-2.34-275.0.1.el9_8.x86_644/22 Upgrading:glibc-langpack-es-2.34-275.0.1.el9_8.x86_645/22 Upgrading:glibc-langpack-fr-2.34-275.0.1.el9_8.x86_646/22 Upgrading:glibc-langpack-zh-2.34-275.0.1.el9_8.x86_647/22 Running scriptlet: glibc-2.34-275.0.1.el9_8.x86_648/22 Upgrading:glibc-2.34-275.0.1.el9_8.x86_648/22 Running scriptlet: glibc-2.34-275.0.1.el9_8.x86_648/22 Upgrading:glibc-headers-2.34-275.0.1.el9_8.x86_649/22 Upgrading:glibc-devel-2.34-275.0.1.el9_8.x86_6410/22 Installing:libxcrypt-static-4.4.18-3.el9.x86_6411/22 Installing:glibc-static-2.34-275.0.1.el9_8.x86_6412/22 Cleanup:glibc-devel-2.34-231.0.1.el9_7.10.x86_6413/22 Cleanup:glibc-headers-2.34-231.0.1.el9_7.10.x86_6414/22 Cleanup:glibc-langpack-en-2.34-231.0.1.el9_7.10.x86_6415/22 Cleanup:glibc-langpack-es-2.34-231.0.1.el9_7.10.x86_6416/22 Cleanup:glibc-langpack-fr-2.34-231.0.1.el9_7.10.x86_6417/22 Cleanup:glibc-langpack-zh-2.34-231.0.1.el9_7.10.x86_6418/22 Cleanup:glibc-2.34-231.0.1.el9_7.10.x86_6419/22 Cleanup:glibc-langpack-de-2.34-231.0.1.el9_7.10.x86_6420/22 Cleanup:glibc-gconv-extra-2.34-231.0.1.el9_7.10.x86_6421/22 Running scriptlet: glibc-gconv-extra-2.34-231.0.1.el9_7.10.x86_6421/22 Cleanup:glibc-common-2.34-231.0.1.el9_7.10.x86_6422/22 Running scriptlet: glibc-common-2.34-231.0.1.el9_7.10.x86_6422/22 Verifying:glibc-static-2.34-275.0.1.el9_8.x86_641/22 Verifying:libxcrypt-static-4.4.18-3.el9.x86_642/22 Verifying:glibc-2.34-275.0.1.el9_8.x86_643/22 Verifying:glibc-2.34-231.0.1.el9_7.10.x86_644/22 Verifying:glibc-common-2.34-275.0.1.el9_8.x86_645/22 Verifying:glibc-common-2.34-231.0.1.el9_7.10.x86_646/22 Verifying:glibc-gconv-extra-2.34-275.0.1.el9_8.x86_647/22 Verifying:glibc-gconv-extra-2.34-231.0.1.el9_7.10.x86_648/22 Verifying:glibc-langpack-de-2.34-275.0.1.el9_8.x86_649/22 Verifying:glibc-langpack-de-2.34-231.0.1.el9_7.10.x86_6410/22 Verifying:glibc-langpack-en-2.34-275.0.1.el9_8.x86_6411/22 Verifying:glibc-langpack-en-2.34-231.0.1.el9_7.10.x86_6412/22 Verifying:glibc-langpack-es-2.34-275.0.1.el9_8.x86_6413/22 Verifying:glibc-langpack-es-2.34-231.0.1.el9_7.10.x86_6414/22 Verifying:glibc-langpack-fr-2.34-275.0.1.el9_8.x86_6415/22 Verifying:glibc-langpack-fr-2.34-231.0.1.el9_7.10.x86_6416/22 Verifying:glibc-langpack-zh-2.34-275.0.1.el9_8.x86_6417/22 Verifying:glibc-langpack-zh-2.34-231.0.1.el9_7.10.x86_6418/22 Verifying:glibc-devel-2.34-275.0.1.el9_8.x86_6419/22 Verifying:glibc-devel-2.34-231.0.1.el9_7.10.x86_6420/22 Verifying:glibc-headers-2.34-275.0.1.el9_8.x86_6421/22 Verifying:glibc-headers-2.34-231.0.1.el9_7.10.x86_6422/22 Upgraded: glibc-2.34-275.0.1.el9_8.x86_64 glibc-common-2.34-275.0.1.el9_8.x86_64 glibc-devel-2.34-275.0.1.el9_8.x86_64 glibc-gconv-extra-2.34-275.0.1.el9_8.x86_64 glibc-headers-2.34-275.0.1.el9_8.x86_64 glibc-langpack-de-2.34-275.0.1.el9_8.x86_64 glibc-langpack-en-2.34-275.0.1.el9_8.x86_64 glibc-langpack-es-2.34-275.0.1.el9_8.x86_64 glibc-langpack-fr-2.34-275.0.1.el9_8.x86_64 glibc-langpack-zh-2.34-275.0.1.el9_8.x86_64 Installed: glibc-static-2.34-275.0.1.el9_8.x86_64 libxcrypt-static-4.4.18-3.el9.x86_64 Complete!样例程序hello.c如下#includestdio.hintmain(void){printf(Hello, world!\n);return0;}默认编译动态链接$ gcc hello.c-ohello_dynamic $ls-lhello_dynamic -rwxr-xr-x.1vagrant vagrant17496Oct806:38 hello_dynamic $ ./hello_dynamic Hello, world!指定-static选项静态编译$ gcc-statichello.c-ohello_static $ls-lhello_static -rwxr-xr-x.1vagrant vagrant875792Oct806:39 hello_static $ ./hello_static Hello, world!最后清理静态库$sudoyum remove glibc-static Dependencies resolved.Package Architecture Version Repository SizeRemoving: glibc-static x86_642.34-275.0.1.el9_8 ol9_codeready_builder9.8M Removing unused dependencies: libxcrypt-static x86_644.4.18-3.el9 ol9_codeready_builder466k Transaction SummaryRemove2Packages Freed space:10M Is this ok[y/N]: y Running transaction check Transaction check succeeded. Running transactiontestTransactiontestsucceeded. Running transaction Preparing:1/1 Erasing:glibc-static-2.34-275.0.1.el9_8.x86_641/2 Erasing:libxcrypt-static-4.4.18-3.el9.x86_642/2 Verifying:glibc-static-2.34-275.0.1.el9_8.x86_641/2 Verifying:libxcrypt-static-4.4.18-3.el9.x86_642/2 Removed: glibc-static-2.34-275.0.1.el9_8.x86_64 libxcrypt-static-4.4.18-3.el9.x86_64 Complete!41-2 (附加题)请熟悉本章的演示程序。本章的演示程序位于目录tlpi-book/shlibs/demo。$ls*.c mod1.c mod2.c mod3.c prog.c $ls*.sh Demo_no_lib.sh Demo_shared_lib.sh Demo_static_lib.sh三个shell脚本分别生成不使用库使用静态库使用动态库共享库的可执行程序$ls-lprog_* -rwxr-xr-x.1vagrant vagrant1460496Oct807:45 prog_nolib -rwxr-xr-x.1vagrant vagrant18936Oct807:46 prog_so -rwxr-xr-x.1vagrant vagrant1419984Oct807:46 prog_static虽然不使用库与使用静态库的可执行文件大小近似但这两种方式存在明显的差别项目方式1直接链接.o方式2静态库 .a中间产物一堆独立.o文件.o 归档文件libdemo.a链接行为所有传入的.o全部完整并入可执行文件仅提取被用到的.o模块未引用模块丢弃可执行体积更大全部目标代码都包含更小只包含用到的模块复用性每次链接都要列出一堆.o不方便复用libdemo.a可以给多个程序重复链接只需写库名符号规则全部目标文件符号全部参与链接链接器按符号依赖按需提取归档内的目标模块适用场景少量文件、一次性编译多个程序共用一组模块打包复用41-3 (附加题)请演示Figure 41-5中的全局符号引用。按图准备2个c语言文件。foo.c如下#includestdio.hvoidxyz(){printf(foo-xyz\n);}voidfunc(){xyz();}prog.c如下#includestdio.hexternvoidfunc();voidxyz(){printf(main-xyz\n);}intmain(){func();return0;}第一种行为调用的是主函数中的xyz函数$ gcc-g-c-fPIC-Wall-cfoo.c $ gcc-g-shared-olibfoo.so foo.o $ gcc-g-oprog prog.c libfoo.so $LD_LIBRARY_PATH. ./prog main-xyz第二种行为调用的是共享库中的xyz函数$ gcc-g-c-fPIC-Wall-cfoo.c $ gcc-g-shared-Wl,-Bsymbolic-olibfoo.so foo.o $ gcc-g-oprog prog.c libfoo.so $LD_LIBRARY_PATH. ./prog foo-xyz最后看一个小错误的修补。ldd显示libfoo.so找不到$ ldd prog linux-vdso.so.1(0x00007ffd927d2000)libfoo.sonot found libc.so.6/lib64/libc.so.6(0x00007fd3f72df000)/lib64/ld-linux-x86-64.so.2(0x00007fd3f74f2000)但是此文件是存在的$find.-namelibfoo.so*./libfoo.so $ objdump-pprog|grepNEEDED NEEDED libfoo.so NEEDED libc.so.6原因是当前目录不在ldd的搜索路径中。如下就可以了$LD_LIBRARY_PATH$PWDldd prog linux-vdso.so.1(0x00007ffee0db4000)libfoo.so/home/vagrant/test/bak/libfoo.so(0x00007f5ca65d5000)libc.so.6/lib64/libc.so.6(0x00007f5ca63c4000)/lib64/ld-linux-x86-64.so.2(0x00007f5ca65dc000)
延伸阅读

更多相关文章

2026/10/10 14:27:56

制造业AI应用场景详解:10大场景+案例+价值,小白也能看懂!

本文梳理了10个制造业AI应用场景,包括生产质检、设备预测性维护、工艺参数优化、智能排产与调度、智能仓储与物流调度、AI供应链寻源与比价、AI合同审查、AI数据决策、AI辅助研发设计、AI能源管理。文章通过实际案例展示了AI在提升效率、降低成本、优化决策等方面的…

2026/10/10 14:27:56

抖音弹幕互动直播植物大战僵尸:从弹幕到游戏操作的完整实现

简介:面向抖音、快手等平台寻求直播互动玩法的创作者与运营者,这份资料提供“弹幕互动直播植物大战僵尸”的完整开播方案。内容涵盖游戏软件、开播教程、直播间搭建指导,以及配套素材与音效,覆盖从环境准备到正式开播的核心链路&a…

2026/10/10 15:43:17

编译原理课程实验全流程解析:从词法分析到目标代码优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 15:43:17

TM4C1294低功耗供电方案:基于PCA9422 PMIC的完整设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 15:43:17

Coze API 封装实战:单例模式、流式与轮询双模式解析

简介:这是一份面向JavaScript开发者、尤其是需要为Web应用集成智能对话能力的研发人员所准备的Coze扣子API聊天机器人封装文档,重点解决API调用繁琐、会话状态难以维护、流式与轮询模式切换不便等问题。资源包内含1个docx文件,整体约18KB&…

2026/10/10 15:38:16

AI Agent安全防线:Harness与AWS AgentCore Gateway集成实战

1. 为什么 AI Agent 需要一张实时安全防线先说一个我最近在客户现场反复念叨的观点:AI Agent 真正的安全问题,不是模型“说错话”,而是它“做错事”。模型幻觉顶多生成一段不准确的文本,但一个接入了工具调用、具备读写权限的 Age…

2026/10/10 7:31:36

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑