C语言中的弱符号与强符号介绍

2023-10-29

        弱符号(Weak symbol)是链接器(ld)在生成ELF(Executable and Linkable Format,缩写为ELF,可执行和可链接格式,是一种用于可执行文件、目标文件、共享库和核心转储的标准文件格式。ELF文件有两种索引:程序标头中记载了运行时所需的段,而段首地址表记载了二进制文件中段的首地址。)文件的过程中使用的一种特殊属性符号。默认情况下,如果没有特别声明,目标文件里面的符号都是强符号(Strong symbol)。在链接过程中,一个强符号会优先于一个同名的弱符号。相比之下,两个同名强符号一起链接会出现链接错误即重复定义错误。当链接一个可执行文件,弱符号可以不定义。但对于强符号,如果没有定义,连接器会产生一个“符号未定义”错误 (undefined symbol)。使用弱符号的目的是,当不确定这个符号是否被定义的情况下,链接器也可以成功链接出ELF文件,适用于某些模块还未实现的情况下,其他模块的先行调试。弱符号在C和C++的规范里面没有被提及,所以使用弱符号的代码,移植性不是非常好,这个跟编译器相关。

        弱符号通常来源于未初始化的全局变量。而默认情况下,编译器将函数和初始化了全局变量作为强符号 。可以通过GCC的__attribute__((weak))来定义任何一个强符号为弱符号。不同的目标文件中不能有同名的强符号,否则不能链接在一起。如果一个符号在某个目标文件中是强符号,在其它文件中都是弱符号,那么该名称在链接时选择强符号。如果一个符号在所有的目标文件中都是弱符号,则选择占用空间(字节数)最大的一个,如果占用空间相同,则按照链接顺序选择第一个。

        以下是测试代码:

        main.c:

#include <stdio.h>

int __attribute__((weak)) x = 1; // weak symbol
int y = 2; // strong symbol
int z; // weak symbol, COM
extern int a; // neither weak symbol nor strong symbol
extern int __attribute__((weak)) b; // weak symbol
static int c; // neither weak symbol nor strong symbol

void __attribute__((weak)) fun1()  // weak symbol
{
    fprintf(stdout, "fun1 Line: %d\n", __LINE__);
}

void __attribute__((weak)) fun2(); // weak symbol

void fun3() // strong symbol
{
    fprintf(stdout, "fun3 Line: %d\n", __LINE__);
}

int main()
{

    fun1();
    fun3();
    if (fun2) {
        fprintf(stdout, "run fun2\n");
        fun2();
    }

    fprintf(stdout, "x = %d, y = %d, z = %d\n", x, y, z);
    fprintf(stdout, "c = %d\n", c);

    return 0;
}

        build.sh:

#! /bin/bash

if [[ -e build  ]]; then
    echo "##### rm build dir"
    rm -rf build
fi

mkdir build
cd build

echo -e "\n##### start build and link:"
gcc -c ../main.c
gcc -o main main.o

echo -e "\n##### read elf:"
readelf --syms main.o

echo -e "\n##### run:"
./main

        执行结果如下:$ ./build.sh


        GitHub: https://github.com/fengbingchun/Linux_Code_Test  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言中的弱符号与强符号介绍 的相关文章

  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 使用 --prof 选项创建多个日志文件而不是一个 v8.log 的节点

    我正在尝试使用 prof 选项来分析我的 Node 应用程序 但我发现不是一个单一的 v8 log 文件 而是使用诸如isolate 0x9582b40 v8 log isolate 0xa1cab78 v8 6049 等前缀创建的多个文件
  • 从哪里获取 iostream.h

    我正在尝试在 Linux 中做一些事情 但它抱怨找不到 iostream h 我需要安装什么才能获取此文件 这个标准头的正确名称是iostream没有扩展名 如果您的编译器仍然找不到它 请尝试以下操作 find usr include na
  • 如何使用 VSCode 调试 Linux 核心转储?

    我故意从我使用 VSCode 编写的 C 应用程序生成核心转储 我不知道如何调试核心转储 有没有人愿意分享这方面的经验 更新 我相信我现在已经可以使用了 我为核心文件创建了第二个调试配置 我需要添加指向生成的转储文件的 coreDumpPa
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • 虚拟内存澄清——大连续内存的分配

    我有一个应用程序 我必须在 Windows 上分配 使用运算符 new 相当大的内存空间 数百 MB 该应用程序是 32 位 我们现在不使用 64 位 即使在 64 位系统上也是如此 我启用了 LARGEADDRESSAWARE 链接器选项
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • 使用 .htaccess 启用 PHP 短标签

    我在自己的 Centos 服务器上设置了 Apache 并具有多个虚拟 Web 服务器 并且我希望仅为位于以下位置的其中一个 Web 服务器启用 PHP 短标记 var www ostickets html 我可以通过添加成功启用短标签sh
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • SIGHUP 用于重新加载配置

    根据signal 7 SIGHUP用于检测控制终端的挂起或控制进程的死亡 然而 我遇到过很多 OSS 守护进程 服务 其中SIGHUP用于启动配置的重新加载 这里有一些例子 hostapd sshd snort etc 这是实现重新加载的标
  • 进程如何知道它已收到信号

    如果我错了 请纠正我 以下是我对信号的理解 据我所知 信号生成 和信号传递有2个不同 事物 为了产生信号 操作系统只是在位数组中设置一个位 在过程控制中维护 工艺块 PCB 每一位 对应于特定信号 当设置一个位时 这意味着 该位对应的信号为
  • Flex 的远程版本误解了我的规则

    我使用 flex 和 bison 编写了一个小汇编程序 可以在我的机器 ubuntu 10 10 上构建并运行正常 现在其他人正在尝试在 arch linux 上构建它 并且他们安装的 flex 产生了不同的 lex yy c 这是不匹配的
  • tar.gz 和 tgz 是同一个东西吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我创建了 tgz 文件tar czvf filecommand then 我最终得到了一个 tgz 文件 我想知道它和tar gz 之间的

随机推荐

  • Xcopy 复制文件和目录,包括子目录

    Xcopy 复制文件和目录 包括子目录 语法 xcopy Source Destination w p c v q f l g d mm dd yyyy u i s e t k r h a m n o x exclude file1 fil
  • Spring FeignClient 遇到的参数问题(RequestParam.value() was empty on parameter 0)

    报错 Caused by java lang IllegalStateException RequestParam value was empty on parameter 0 代码 PostMapping value org getOrg
  • 下载徐小明新浪博客全部博文链接

    利用爬虫把徐小明新浪博客里的所有博文链接爬下来 保存到脚本所在路径的csv文件中 python2 7代码 把起始博文目录链接换成其他的也是完全可以的 详细内容请关注微信公众号 岛城窝窝 代码如下 usr bin env python cod
  • sklearn分类任务模型评价指标汇总与AUC-ROC曲线及代码示例

    文章目录 1 分类指标 2 整合工具函数 3 使用示例 1 分类指标 二分类可以参考下图 准确率 预测对的样本数 全部样本数 精确率 被预测出的正例样本数 预测为正例的样本数 召回率 预测且真的是正例的样本数 正例的样本数 二分类F1 2
  • 《Spring Boot实战》之二:开发第一个应用程序

    本章使用Spring Boot实现一个简单的例子 主要包括两个知识点 使用Spring Boot的起步依赖 使用Spring Boot自动进行Spring的配置 2 1 运用Spring Boot 下面将使用Spring Boot创建一个简
  • [力扣]只出现一次的数字

    给定一个非空整数数组 除了某个元素只出现一次以外 其余每个元素均出现两次 找出那个只出现了一次的元素 说明 你的算法应该具有线性时间复杂度 你可以不使用额外空间来实现吗 作者 力扣 LeetCode 链接 https leetcode cn
  • Linux中级实战讲解--Mysql-galera集群

    Galera Cluster 介绍 Galera是一个MySQL 也支持MariaDB Percona 的同步多主集群软件 主要功能 同步复制 Active active的多主拓扑结构 真正的multi master 即所有节点可以同时读写
  • Android 10.0 禁用插入耳机时弹出的保护听力对话框

    1 前言 在10 0的系统开发中 在某些产品中会对耳机音量调节过高限制 在调高到最大音量的70 的时候 会弹出音量过高弹出警告 所以产品 开发的需要要求去掉这个音量弹窗警告功能 2 禁用插入耳机时弹出的保护听力对话框的核心类 framewo
  • 什么是物模型?阿里小米京东物模型规则对比

    什么是物模型 物模型是产品数字化的描述 定义了产品的功能 物模型将不同品牌不同品类的产品功能抽象归纳 形成 标准物模型 便于各方用统一的语言描述 控制 理解产品功能 物模型由若干条 参数 组成 参数按描述的功能类型不同 又分为属性 方法和事
  • shc gzexe 将shell脚本转换为二进制的可执行文件

    第一种方法 gzexe 这种加密方式不是非常保险的方法 但是能够满足一般的加密用途 可以隐蔽脚本中的密码等信息 它是使用系统自带的gzexe程序 它不但加密 同时压缩文件 使用方法 gzexe file sh它会把原来没有加密的文件备份为
  • Netty源码解析系列三:Netty与Tomcat的区别

    Netty与Tomcat的区别 作用不同 Tomcat 是 Servlet 容器 可以视为 Web 服务器 而 Netty 是异步事件驱动的网络应用程序框架和工具用于简化网络编程 例如TCP和UDP套接字服务器 协议不同 Tomcat 是基
  • Random.Range 范围

    第一 Random Range随机数问题 时间20141212 今天在开发中用到随机数 差点就错过了 没注意这个问题 for int ooi 0 ooi lt 5000 ooi int hhh Random Range 0 3 if hhh
  • latex 参考文献没有显示_LaTeX 中的参考文献

    LaTeX 的对参考文献的处理实在是非常的方便 我用过几次 有些体会 写出来供大家 参考 当然 自己的功力还不够深 有些地方问题一解决就罢手了 没有细究 LaTeX 对参考文献的处理有这么一些优点 1 可以维护一个 bib 文件 在你的整个
  • 系统架构技能之设计模式-组合模式

    一 上篇回顾 我们上篇主要讲述了结构型模式中的外观模式 外观模式作为结构型模式中的一个简单又实用的模式 外观模式通过封装细节来提供大粒度的调用 直接的好处就是 封装细节 提供了应用写程序的可维护性和易用性 外观模式一般应用在系统架构的服务层
  • 【转】Vector与ArrayList区别

    the following is from http blessed24 javaeye com blog 751336 1 Vector ArrayList 1 Vector的方法都是同步的 Synchronized 是线程安全的 thr
  • 以太坊DAO之时间锁定Multisig

    Decentralized Autonomous Organization 简称DAO 以太坊中重要的概念 一般翻译为去中心化的自治组织 有时候 时间也可以用作一种很好的安全机制 以下代码基于DAO区块链大会 但有不同的变化 不是每个操作需
  • IdWorker---分布式ID工具类

    IdWorker 分布式ID工具类 import java lang management ManagementFactory import java net InetAddress import java net NetworkInter
  • ip地址的转换与递增

    void a void unsigned long addr inet addr 192 168 0 1 addr ntohl addr addr addr htonl addr char a 0x20 in addr in in S un
  • jenkins 发送邮件失败

    jenkins 配置发送邮件 发送测试邮件 邮件发送失败 Failed to send out e mail javax mail MessagingException Could not connect to SMTP host loca
  • C语言中的弱符号与强符号介绍

    弱符号 Weak symbol 是链接器 ld 在生成ELF Executable and Linkable Format 缩写为ELF 可执行和可链接格式 是一种用于可执行文件 目标文件 共享库和核心转储的标准文件格式 ELF文件有两种索