4.5 静态库链接

2023-11-17

4.5 静态库链接

  • 一种语言的开发环境往往会附带语言库(language library), 这些库通常是对操作系统API的包装。例如C语言标准库的函数strlen()并没有调用任何操作系统的API,但是很大一部分库函数都要调用操作系统API,例如print()
  • 静态库可以简单地看做一组目标文件的集合,即很多目标文件经过压缩打包后形成的一个文件。例如C语言静态库libc.a,该库是glibc项目的一部分。glibc的介绍
  • 接下来将介绍一个程序的目标文件如何与c语言运行库链接形成一个可执行文件。
    • C语言的运行库,包含了很多跟操作系统功能相关的代码,比如输入输出,文件操作,日期,内存管理等。glibc本身就是C语言开发的,它由成千上百个C语言源代码文件组成,也就是说,编译后有相同数量的目标文件,比如输入输出的scanf.o,printf.o;文件操作有fread.o,fwrite.o;时间日期有date.o,time.o; 内存管理有malloc.o等。把这些零散的目标文件直接提供给库的使用者,很大程度上会造成文件传输,管理和组织方面的不便,于是人们通常用“ar”压缩程序将这些目标文件压缩到一起,并且对其进行编号和索引,以便查找和检索,就形成了libc.a这个静态库文件。我们可以使用ar -t libc.a命令查看该库文件包含哪些目标文件.
    • 如何在这么多目标文件中找到print函数所在的目标文件? 可以通过objdump 或者 readelf加上文本查找工具如"grep"grep
    • 直接链接hello.o和print.o会出错。原因:print.o依赖于其他的目标文件,同时这些目标文件可能依赖于其他目标文件。链接器会处理这些繁琐的操作,自动寻找所有需要的符号以及它们所在的目标文件,将这些目标文件从libc.a中解压出来,最终将它们链接在一起形成一个可执行文件。
    • 实际上linux系统上的库比我们想象的要复杂,当我们编译和链接一个普通C程序时,不仅用到C语言库libc.a,而且会用到其他一些辅助的目标文件和库。我们可以通过-verbose将整个编译链接过程的中间过程打印出来。gcc -static --verbose -fno-builtin hello.c,-static 指的静态链接; --verbose将整个编译链接过程的中间步骤打印出来(显示程序详细编译过程)。verbose:冗余的,啰嗦的;-fno-builtin关闭内置函数优化选项;从结果上,有三个关键步骤:
    • 调用ccl程序,这个程序是GCC的C语言编辑器,将hello.c编译成一个临时的汇编文件.s
    • 调用as程序,这个程序是GNU的汇编器,将汇编文件.s汇编成临时目标文件.o
    • 调用collect2程序完成链接,该程序是对ld链接器的一个包装,会调用ld链接器来完成对目标文件的链接,然后再对链接结果进行一些处理,主要是收集所有与程序初始化相关信息并且构造初始化的结构。
  • Q: 为什么** 静态运行库里面一个目标文件只包含一个函数**?例如libc.a的printf.o只包含printf函数。
  • A:如果很多函数都放在一个目标文件中,很可能很多没有用的函数都被一起链接进输出结果中。运行库有成百上千个函数,每个函数独立地放在一个目标文件中可以减少空间浪费。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4.5 静态库链接 的相关文章

  • 打击垃圾邮件机器人

    我的网站中有 C 表单 希望防止垃圾邮件机器人填写它 诀窍是 我想避免 CAPTHA 或任何其他用户输入 以避免丢失单个注册 以下是我心中的一些技巧 隐藏输入栏 问题 这还有效吗 跟踪时间 从第一个用户输入 关注名字 到发布表单 人类需要
  • C语言中的递归是如何工作的?

    我试图了解 C 中递归的工作原理 任何人都可以给我解释控制流吗 include
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 使用 JSON 格式正确配置 NLog 到 IHostBuilder

    我有以下代码 应该接受 NLog 的 JSON appsettings 配置 然后使用它来创建 NLog LogFactory 这个 NLog 工厂应该被传递到 MyService 类中 以便在那里创建一个记录器 class Program
  • 在调用堆栈中看到大量 clr!CLR Semaphore::Wait

    我们看到很多像下面这样的调用堆栈 我可以知道什么条件 情况会发生这种情况吗 OS Thread Id 0x48654 559 Current frame ntdll NtWaitForSingleObject 0xa Child SP Re
  • 操作/Lambda 表达式内存管理问题

    我将一个操作存储在局部变量中 然后在该局部变量超出范围后使用 使用前是否有被清理的危险 这是一个例子 public List GetMaps Action
  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • 在 C# 中调用事件处理程序

    我一直在尝试学习如何在 C 中使用事件处理程序 但我无法弄清楚 handler this e 在以下代码中的作用 public event EventHandler ThresholdReached protected virtual vo
  • 在 C++ 中使用表达式模板进行符号微分

    如何在 C 中使用表达式模板实现符号微分 一般来说 您需要一种表示符号的方法 即编码的表达式模板 例如3 x x 42 以及一个可以计算导数的元函数 希望您对 C 中的元编程足够熟悉 知道这意味着什么和需要什么 但可以给您一个想法 This
  • 函数参数评估顺序[重复]

    这个问题在这里已经有答案了 在 C 和 C 中 函数参数的求值是否有固定的顺序 我的意思是 标准怎么说 是吗left to right or right to left 我从书中得到的信息令人困惑 是否有必要function call应该使
  • 捕获另一个进程未处理的异常

    我想知道我是否可以捕获我开始使用 Process Start 的另一个进程抛出的未处理的异常 我知道我可以用这个捕获标准错误link http social msdn microsoft com Forums en US csharpgen
  • 将一个整数从 C 客户端发送到 Java 服务器

    我使用此代码将一个整数从我的 Java 客户端发送到我的 Java 服务器 int n rand nextInt 50 1 DataOutputStream dos new DataOutputStream socket getOutput
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • 非静态类中的静态方法和静态类中的静态方法有什么区别?

    我有两个班级A级和B级 static class ClassA static string SomeMethod return I am a Static Method class ClassB static string SomeMeth
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • 如何在用户空间程序中使用内核 libcrc32c (或相同的函数)?

    我想在我自己的用户空间程序中进行一些 CRC 检查 我发现内核加密库已经在系统中 并且支持 SSE4 2 我尝试直接 include
  • 类模板的 C++ 静态成员 - 链接器警告“多重定义”[重复]

    这个问题在这里已经有答案了 假设出于某种原因 我想要一个类模板 MyTemp 和一些静态数据成员 smDummyVar Mytemp h ifndef MY TEMP H define MY TEMP H template

随机推荐

  • Python更改文件的编码格式

    Python更改文件的编码格式 import os from chardet universaldetector import UniversalDetector def change encode file change 2 type d
  • MySQL Flashback 闪回功能详解

    1 简介 mysqlbinlog flashback 闪回 用于快速恢复由于误操作丢失的数据 在DBA误操作时 可以把数据库恢复到以前某个时间点 或者说某个binlog的某个pos 比如忘了带where条件的update delete操作
  • FreeType简介及在vs2010的编译使用

    FreeType库是一个开源 高质量 可扩展 可定制 可移植的字体引擎 它提供统一的接口来访问多种字体格式文件 包括点阵字 TrueType OpenType Type1 CID CFF Windows FON FNT X11 PCF等 F
  • 2021.11.30 面试题

    1 请你介绍一下map的分类和常见的情况 java为数据结构中的映射定义了一个接口java util Map 它有四个实现类 分别是HashMap Hashtable LinkedHashMap 和TreeMap Map主要用于存储健值对
  • simulink仿真 adc 采样ePWM输出例程

    新建文件夹并用matlab打开 写入这两个模块 配置 ADC 配置ePWM 不使能B 关了就行 其他的默认即可 配置烧录 连线 示波器接pwma1 和地 adc chanl1接 3 3v或者 0 3 3 都行 转化是 x 3 3 2 12
  • backtrace函数与assert断言宏封装

    这篇文章是在阅读 sylar 框架时 对断言宏的封装所做的总结 在实际开发中 我们经常会遇到一种境况 如果程序执行的不是我们想要的正确结果 需要程序立即中断执行 我们希望得到其有效的错误信息 比如其出现错误的函数 文件 代码行号 和参数文本
  • iOS App icon、启动页、图标规范

    原文 iOS App icon 启动页 图标规范 以下内容都是我在做App时通过自己的经验和精品的分析得来的 希望会帮助到你 但是有时个别情况也要个别分析 要活学活用 一 App Icon 在设计iOS App Icon时 设计师不需要切圆
  • 招募 AIGC 训练营助教 @上海

    诚挚邀请对社区活动感兴趣的你 成为我们近期开展的训练营助教 与我们共同开启这场创新之旅 助教需要参与 协助策划和组织训练营活动 协助招募和筛选学员 协助制定训练营的宣传方案 负责协调和组织各项活动 助教可获得 AIGC知识库 获得社区提供的
  • 服务器端Session、客户端Session和Cookie的区别

    1 Session其实分为客户端Session和服务器端Session 当用户首次与Web服务器建立连接的时候 服务器会给用户分发一个 SessionID作为标识 SessionID是一个由24个字符组成的随机字符串 用户每次提交页面 浏览
  • 微型小程序页面跳转加携带数据

    一 WXML中
  • 列表数据转树形数据 trees-plus 使用方法(支持typescript)

    trees plus Operations related to tree data Install npm i trees plus S Import import TreesPlus from trees plus Usage impo
  • 如何使用DLL函数动态加载-静态加载

    公司里的项目里用到加密解密 使用的是客户指定的DLL库来加密解密 开始 我按照以前的方法来使用DLL库 这里也介绍下吧 虽然网上很多 一般动态加载DLL的步骤如下 HINSTANCE DLL库实例名 LoadLibrary T DLL库名
  • 高德api 实现根据中文地址地图打点弹窗

  • diffusion models笔记

    ELBO of VDM Understanding 1 中讲 variational diffusion models VDM 的 evidence lower bound ELBO 推导时 53 式有一个容易引起误会的记号
  • Promethus(普罗米修斯)安装与配置(亲测可用)

    1 普罗米修斯概述 Prometheus 是由go语言 golang 开发 是一套开源的监控 报警 时间序列数 据库的组合 适合监控docker容器 Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包 自201
  • 字符串匹配算法0-基本概念

    字符串匹配的算法在很多领域都有重要的应用 这就不多说了 我们考虑一下算法的基本的描述 给定大小为 字母表 上的长度为n的文本t和长度为m的模式p 找出t中所有的p的出现的地方 一个长度为m的串p表示为一个数组p 0 m 1 这里m 0 当然
  • [前端系列第5弹]JQuery简明教程:轻松掌握Web页面的动态效果

    在这篇文章中 我将介绍jQuery的基本概念 语法 选择器 方法 事件和插件 以及如何使用它们来实现Web页面的动态效果 还将给一些简单而实用的例子 让你可以跟着我一步一步地编写自己的jQuery代码 一 什么是JQuery JQuery是
  • 【异步系列五】关于async/await与promise执行顺序详细解析及原理详解

    前段时间总结了几篇关于异步原理 Promise原理 Promise面试题 async await 原理的文章 链接如下 感兴趣的可以去看下 相信会有所收获 一篇文章理清JavaScript中的异步操作原理 Promise原理及执行顺序详解
  • 博客4:YOLOv5车牌识别实战教程:模型优化与部署

    摘要 本篇博客将详细介绍如何对YOLOv5车牌识别模型进行优化和部署 我们将讨论模型优化策略 如模型蒸馏 模型剪枝和量化等 此外 我们还将介绍如何将优化后的模型部署到不同平台 如Web 移动端和嵌入式设备等 车牌识别视频 正文 4 1 模型
  • 4.5 静态库链接

    4 5 静态库链接 一种语言的开发环境往往会附带语言库 language library 这些库通常是对操作系统API的包装 例如C语言标准库的函数strlen 并没有调用任何操作系统的API 但是很大一部分库函数都要调用操作系统API 例