什么是weak symbol?

2023-11-15

 
weak symbol
 
我们用nm看动态库时,会发现有些符号类型是"V",手册里解释如下:
"V" The symbol is a weak object.  When a weak defined symbol is linked with a normal  defined  symbol, the normal defined symbol is used with no error. When a weak undefined symbol is linked and the symbol is not defined, the value of the weak symbol becomes zero with no error.
说的是动态库中的weak symbol,缺省会被normal symbol替代,如果没有定义,则该symbol的值为0。
很抽象,是不是,我一直想找一个简单的例子。
             
最近看过一篇文章:
http://www.cs.virginia.edu/~wh5a/blog/2006/07/20/the-weak-attribute-of-gcc/
终于对所谓的weak symbol有了一点了解。
http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Function-Attributes.html
讲了__attribute__的语法。
 
【weak.c】
extern void foo() __attribute__((weak));
int main() {
  if (foo) foo();
}
程序居然能够编译通过,甚至成功执行!让我们来看看是为什么?
首先声明了一个符号foo(),属性为weak,但并不定义它,这样,链接器会将此未定义的weak symbol赋值为0,也就是说foo()并没有真正被调用,试试看,去掉if条件,肯定core dump!
 
【strong.c】
extern void foo() ;
int main() {
  if (foo) foo();
}
这个是一般程序,编译过不了:
strong.c: undefined reference to `foo'
再添上一个定义文件:

【foo.c】
void foo() {
  printf("in foo./n");
}
OK!
 
用nm检查一下:
linux:~/test/weak # nm weak.o
         w foo
00000000 T main
linux:~/test/weak # nm foo.o
00000000 T foo
         U printf
链接时,前面那个weak symbol会被后面这个代替,如果没有链接foo.o,也没问题,对应符号为0。
 
这就是weak symbol的意义。
-------------------------------------------------------------------------------------------------------------------------------------------
`V' The symbol is a weak object.  When a weak defined symbol is linked with a normal defined  symbol, the  normal defined symbol is used with no error.  When a weak undefined symbol is linked and the symbol is not defined, the value of the weak symbol becomes zero with no error.
`W' The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.   When a  weak  defined symbol is linked with a normal defined symbol, the normal defined symbol is used with no error.  When a weak undefined symbol is linked and the symbol is not defined,  the  value of the weak symbol becomes zero with no error.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是weak symbol? 的相关文章

  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 从 Python 调用 PARI/GP

    我想打电话PARI GP http pari math u bordeaux fr dochtml gpman html仅从Python计算函数nextprime n 对于不同的n是我定义的 不幸的是我无法得到帕里蟒蛇 http code
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • 递归修剪对象中所有元素的更好方法?

    如果我有一个像这样的物体 const obj field subfield innerObj a asdasd asdas innerArr s ssad innerArrObj b adsad 我想出了这样的东西 const trimFi
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • 使用 VBA 将 Excel 电子表格中嵌入的 Word 文档保存到磁盘

    我们有一个 Excel 电子表格 当前使用存储在公司 LAN 上的 Word 模板生成报告 这对于内部用户来说效果很好 但对于没有连接到 LAN 的任何人来说就不行了 例如 笔记本电脑用户 管理层不希望将模板作为单独的文件分发给外部用户 而
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • 在 C 中通过引用传递数组

    我是 C 新手 我有一个疑问 由于 C 函数创建其参数的本地副本 我想知道为什么以下代码按预期工作 void function int array array 0 4 array 1 5 array 2 6 int main int arr
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是

随机推荐

  • ADS1115(ADC)16 位分辨率的高精度模数转换器的操作步骤

    ADS1113 ADS1114 和ADS1115 是具有16 位分辨率的高精度模数转换器 ADC 采用超小型的无引线QFN 10 封装或MSOP 10 封装 ADS1113 4 5 在设计时考虑到了精度 功耗和实现的简易性 ADS1113
  • Java的反射技术(Class类,Constructor类,Method类, Field类)

    Java编码时知道类和对象的具体信息 此时直接对类和对象进行操作即可 无需反射 如果编码时不知道类或者对象的具体信息 此时应该使用反射来实现 为什么要使用反射 反射就是把Java类中的各种成分映射成一个个的java对象 例如 一个类有 成员
  • 基于QT:温度串口图像显示

    用Qt自己写一个上位机 将串口发过来的温度信息 显示出来 并且绘画出温度曲线 上图 采用QT绘画曲线 首先当然是采用 qwt控件 而Qt没有自带的qwt控件 所以需要按住移植qwt控件方法具体步骤如下 1 Download and inst
  • 图表、数据可视化笔记

    框架 Echarts Three js ECharts Echarts在线例子 EChartsGallary https www makeapie com explore html sort ranktimeframe allauthor
  • 多操作系统的服务器虚拟化详解 蓝色梦想网

    虚拟化有很多种技巧 这里我们将主要解释有关在硬件上模拟运行两个或者更多操作系统的服务器虚拟化 可以说 因为虚拟化技术避免了服务器使用浪费 所以这项技术获得了广泛应用 一般来说 一台服务器装载和使用一个物理服务器操作系统 一般服务器的平均CP
  • docker应用笔记

    三个概念 Image 只读模板 可以创建docker容器 docker images 列出本地镜像 docker rmi IDXXX 移除镜像 Container 从镜像创建的运行实例 docker ps 运行中的容器 docker ps
  • 用OpenWrt软路由做旁路由-VMWARE版

    1 环境准备 OpenWrt镜像 在vmware中安装的镜像源下载地址 openwrt releases安装包下载 开源镜像站 阿里云本例使用的是22 03 2版本 下载地址https mirrors aliyun com openwrt
  • 3ds max文件打包?max插件CG Magic一键打包整起!

    3ds max文件如何打包 这个问题 小编听到不少网友的提问 今天CG Magic小编来和大家聊聊 文件更高效的操作 如何打包处理呢 3DMAX这款软件的受众群体是比较高的 在工作方便的同时 共享打包也是比较方便的 3DMAX创建的文件打包
  • 基于Linux下的TCP编程

    基于Linux的TCP网络编程 一 Linux下TCP编程框架 TCP网络编程的流程包含服务器和客户端两种模式 服务器模式创建一个服务程序 等待客户端用户的连接 接收到用户的连接请求后 根据用户的请求进行处理 客户端模式则根据目的服务器的地
  • 低版本IBM MQ API在MQ7.5/8版本上正常运行的程序修改方法

    一 测试前准备 所有数据测试前 先替换成对应版本的jar包 二 MQ7 5 MQ7 5跟以前版本的区别是 更加安全的认证 API的option发生了变化 测试环境 操作系统 服务器 MQ版本 SUSE 11 192 168 32 144 7
  • LeetCode 1769. 移动所有球到每个盒子所需的最小操作数

    有 n 个盒子 给你一个长度为 n 的二进制字符串 boxes 其中 boxes i 的值为 0 表示第 i 个盒子是 空 的 而 boxes i 的值为 1 表示盒子里有 一个 小球 在一步操作中 你可以将 一个 小球从某个盒子移动到一个
  • Java使用Milo实现OPC UA客户端

    文章目录 一 Milo库 二 OPC UA服务端及客户端 三 Java连接OPC UA服务端 3 1 依赖 3 2 创建opc ua客户端 3 3 遍历树形节点 3 4 读取节点数据 3 5 写入节点数据 3 5 订阅 单个 3 6 批量订
  • java 多线程学习笔记之 线程同步

    在前面我们将了很多关于同步的问题 然而在现实中 需要线程之间的协作 比如说最经典的生产者 消费者模型 当队列满时 生产者需要等待队列有空间才能继续往里面放入商品 而在等待的期间内 生产者必须释放对临界资源 即队列 的占用权 因为生产者如果不
  • 携程连接服务器失败显示0048,携程网回应:携程服务器出故障期间可访问艺龙旅行网...

    2015年5月28日 携程服务器出故障后 官方回应 这期间消费者可访问艺龙旅行网 28日 很多人的朋友圈被一则携程服务瘫痪的消息刷屏 震惊了业界和消费者 记者28日登录携程系统发现 携程官方网站今日突然陷入瘫痪 打开主页后点击时均显示 Se
  • [VS Code]跟我一起在Visual Studio Code 添加自定义snippet(代码段),附详细配置

    Add code snippets for CLANG in VS Code 日志 2021 12 16 VSCode 自 v1 40 起 引入新的变量 WORKSPACE FOLDER RANDOM 和 RANDOM HEX 自 v1 4
  • PostgreSQL 用户和角色管理

    PostgreSQL的用户管理 用户和角色的区别 用户有权限 角色没有权限 一 组角色管理 使用组角色的概念管理数据库访问权限 1 创建组角色 一个组角色可以看做是一组数据用户 组角色可以拥有数据库对象 比如表 以及可以把这些对象上的权限赋
  • DDR SDRAM的内部结构Cell Structure(预充电+刷新)

    文章目录 读过程 包含预充电步骤 写过程 写0 写1 DDR为什么要刷新 以上图Cell0为例子 读过程 包含预充电步骤 首先关闭所有字线 W0 W1 Wn 让所有FET均不导通 然后将位线B0通过预充电开关Precharge 图中未画出
  • 面试官:HBase 有哪些优化点?

    这是个相对开放的问题 问题没有那么得细 面对这种问题千万不要乱了阵脚 其实这种问题答得好是很加分的 可以从几个不同的方向来回答 这样显得有条理 而且可以向面试官展现你的多维度思考和总结的能力 两个角度 一个从使用者的角度 一个从维护者的角度
  • CopyFile()的使用方法

    1 设置工程默认的Unicode字符集为Not Set 编写代码如下 函数CopyFile source destination false 表示 如果目标文件夹已经有相同的文件 则该文件会被替换 函数CopyFile source des
  • 什么是weak symbol?

    weak symbol 我们用nm看动态库时 会发现有些符号类型是 V 手册里解释如下 V The symbol is a weak object When a weak defined symbol is linked with a no