GCC中的弱符号与强符号
GCC中的弱符号与强符号
我们经常在编程中碰到一种情况叫符号重复定义。多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误。比如我们在目标文件A和目标文件B都定义了一个全局整形变量global,并将它们都初始化,那么链接器将A和B进行链接时会报错:
- 1 b.o:(.data+0x0): multiple definition of `global'
- 2 a.o:(.data+0x0): first defined here
- extern int ext;
- int weak;
- int strong = 1;
- __attribute__((weak)) weak2 = 2;
- int main()
- {
- return 0;
- }
- 规则1:不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号);如果有多个强符号定义,则链接器报符号重复定义错误。
- 规则2:如果一个符号在某个目标文件中是强符号,在其他文件中都是弱符号,那么选择强符号。
- 规则3:如果一个符号在所有目标文件中都是弱符号,那么选择其中占用空间最大的一个。比如目标文件A定义全局变量global为int型,占4个字节;目标文件B定义global为double型,占8个字节,那么目标文件A和B链接后,符号global占8个字节(尽量不要使用多个不同类型的弱符号,否则容易导致很难发现的程序错误)。
弱引用和强引用
- __attribute__ ((weakref)) void foo();
- int main()
- {
- foo();
- }
我们可以将它编译成一个可执行文件,GCC并不会报链接错误。但是当我们运行这个可执行文件时,会发生运行错误。因为当main函数试图调用foo函数时,foo函数的地址为0,于是发生了非法地址访问的错误。一个改进的例子是:
- __attribute__ ((weakref)) void foo();
- int main()
- {
- if (foo)
- foo();
- }
- #include <stdio.h>
- #include <pthread.h>
- int pthread_create( pthread_t*, const pthread_attr_t*,
- void* (*)(void*), void*) __attribute__ ((weak));
- int main()
- {
- if(pthread_create)
- {
- printf("This is multi-thread version!\n");
- // run the multi-thread version
- // main_multi_thread()
- }
- else
- {
- printf("This is single-thread version!\n");
- // run the single-thread version
- // main_single_thread()
- }
- }
编译运行结果如下:
- $ gcc pthread.c -o pt
- $ ./pt
- This is single-thread version!
- $ gcc pthread.c -lpthread -o pt
- $ ./pt
- This is multi-thread version!
- static int x() __attribute__ ((weakref ("y")));
- /* is equivalent to... */
- static int x() __attribute__ ((weak, weakref, alias ("y")));
- /* and to... */
- static int x() __attribute__ ((weakref));
- static int x() __attribute__ ((alias ("y")));
http://blog.csdn.net/u010129119/article/details/54949633
GCC中的弱符号与强符号的更多相关文章
- GNU C/C++ __attributes__ GCC中的弱符号与强符号
最近在看一些源代码,遇到了一些使用__attribute__修饰函数和变量的属性方面的代码,不是太了解,很是汗颜,再此做个总结: GCC使用__attribute__关键字来描述函数,变量和数据类 ...
- GCC中的强符号和弱符号及强引用和弱引用
1. 强符号和弱符号 1.1 u-boot和kernel中的__weak指令 u-boot和kernel比较普遍地使用了__weak来定义函数. 在include\linux\compiler-gcc ...
- C语言中的强符号与弱符号
转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...
- 关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正
首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
- 嵌入式C语言自我修养 09:链接过程中的强符号和弱符号
9.1 属性声明:weak GNU C 通过 __atttribute__ 声明weak属性,可以将一个强符号转换为弱符号. 使用方法如下. void __attribute__((weak)) fu ...
- 浅谈C语言中的强符号、弱符号、强引用和弱引用【转】
转自:http://www.jb51.net/article/56924.htm 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引 ...
- C语言强、弱符号,强、弱引用
C语言强.弱符号,强.弱引用 符号定义 在编程中我们经常碰到符号重复定义的情况,当我们在同一个作用域内重复定义同一个变量时,有时是因为误写,有时是文件之间的冲突,编译器的处理方式就是报错: redef ...
- gcc/g++中weak弱符号及alias别名
最近查看linux内核代码时,表现了一些编译器选项如__attribute_((weak)).__attribute__( (alias("target"))),一开始不了解,后来 ...
随机推荐
- 前端自动化构建yeoman
前端自动化可分为: yo(脚手架工具).grunt(构建工具).bower(包管理器). OMAN的特性 http://yeoman.io/learning/ 闪电般的初始化:项目开始阶段,可以基 ...
- siblings() next() nextAll() nextUntil() prev() prevAll() prevUntil() 在 DOM 树中水平遍历
$(document).ready(function(){ $("h2").siblings(); });拿到h2标签的所有的同级元素什么标签都可以 $(document).rea ...
- 如何 打包整合linux系统文件夹 用于刷机包等等, 其中包括打包 句号开头 . 开头的文件, 排除系统文件 等
tar --exclude=proc/* --exclude=sys/* -cvjf rootfs.tar.bz2 * .[!.]* -R
- &:first-of-type含义
span { &:first-of-type { margin-right: 16px; } } &符号是scss和less里的语法,代表上一级选择器,实际编译成css就是 span: ...
- [bzoj3743 Coci2015] Kamp(树形dp)
传送门 Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的 ...
- SpProcPool阅读笔记--1
公司产品用了一个开源的框架,最近出了点问题,细看了这个框架. SpProcPool: https://github.com/spsoft/spprocpool.git 我们的线程池用的是传递文件描述 ...
- selenium+java实现浏览器前进、后退和刷新
- [Angular] Component's dependency injection
An Angular service registered on the NgModule is globally visible on the entire application. Moreove ...
- 腾讯云 ubuntuservermysql安装和外网訪问
1 腾讯云 购买ubuntu 默认账户是ubuntu(因为winscp 使用ubuntu没有权限写文件) 因为腾讯云主机ubuntu系统默认username为ubuntu,不喜欢每次做什么都要sudo ...
- Java笔试面试题001
Java笔试面试题之中的一个 1.Struts1中actionform和action属于MVC哪一层,为什么? 解答:actionform和action属于MVC的Model层,Action用来处理业 ...