__attribute__((weak))】的更多相关文章

弱符号是什么? 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误.链接器会忽略弱符号,去使用普通的全局符号来解析所有对这些符号的引用,但当普通的全局符号不可用时,链接器会使用弱符号.当有函数或变量名可能被用户覆盖时,该函数或变量名可以声明为一个弱符号.弱符号也称为weak alias(弱别名). attribute((weak))的作用 情况是这样的,碰到一个棘手的问题:我们不确定外部模块是否提供一个函…
简单的说,就是当发生 “重复定义的时候”.被声明者会被冲突者覆盖掉. 这里还涉及了weak与alias连用的情况. 参见,里边有两个例子,很浅显易懂. https://my.oschina.net/senmole/blog/50887 还有一个用法是,让未定义的函数在没实现的情况下,不影响程序的编译. 我自己写了个例子,如下: [root@D128 examples]# cat test.c #include <stdio.h> #include <stdint.h> #ifdef…
参考gcc的reference: 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误.链接器会忽略弱符号,去使用普通的全局符号来解析所有对这些符号的引用,但当普通的全局符号不可用时,链接器会使用弱符号.当有函数或变量名可能被用户覆盖时,该函数或变量名可以声明为一个弱符号.弱符号也称为weak alias(弱别名). 怎样声明弱符号: 通过alias,结合weak属性,声明一个弱符号,例如: 1: int…
情况是这样的,碰到一个棘手的问题:我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数,即自己模块的代码必须用到func函数: extern int func(void); ................... int a = func(); if( a > .....) { .......... } ............ 我们不知道func函数是否被定义了 这会导致2个结果: 1:外部存在这个函数func,并且EXPORT_SYMBOL(func),那么在我自己的模块使用…
关于 weak weak经常出现在各种c代码中,其作用是将当前文件的对应函数声明为弱函数符号,如果外部文件出现相同的函数名,最终编译出来的 文件会优先指向外部文件的函数符号: 通常需要使用__attribute__,不知道标准C有没有这样的用法:具体如下所示: void foo(void) __attribute__ ((weak, warn_unused_result)); 或者 __attribute__ ((weak, warn_unused_result)) void foo(void)…
先说结论: ①:动态库优先级最差,如果同时有静态库和动态库,那么首先使用的是静态库函数. ②:如果只有两个或多个动态库,那么首先使用的是最开始链接的动态库函数: ③:弱符号函数在动态库中是起任何作用的 ④:动态库是强函数,静态库是若符号函数,那么extern使用的就是若符号函数 下面举例说明: Ⅰ:首先是本源文件中包含若函数,然后链接动态库的强符号函数.如下分别是源码和结论 //main.cpp #include<stdio.h> #define _weak __attribute__((we…
最近查看linux内核代码时,表现了一些编译器选项如__attribute_((weak)).__attribute__( (alias("target"))),一开始不了解,后来自己查看资料及书籍算是对gcc的这个编译属性有了一定的认识. 一.先了解weak属性. __attribute__((weak))表示为弱符号属性,所谓的弱符号是针对于强符号来说的,我们定义的全局已初始化变量及全局函数等都是属于强符号,在链接时如果有多个强符号就会报错误:而弱符号主要指未初始化的全局变量或通过…
一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① 同名的强符号只能有一个,否则编译器报"重复定义"错误. ② 允许一个强符号和多个弱符号,但定义会选择强符号的. ③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个. 二.哪些符号是弱符号? 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误.比如我们在目…
Weak Alias 跟 Weak Reference 完全没有任何关系,不过是我在看到 Weak Reference 的时候想到的而已. Weak Alias 是 gcc 扩展里的东西,实际上是函数的属性.这个东西在库的实现里面可能会经常用到,比如 glibc 里面就用了不少.抄录一段 gcc 手册里面的话解释下函数属性是干啥的, In GNU C, you declare certain things about functions called in your program which…
很多东西,只看看是不行的,要想深入的去了解一个东西,一定要去不断地学习,实践,反思. 说白了就是要去打磨. 在linux中,最近遇到了这样一个定义: int board_usb_init(int index, int usb_init_type) __attribute__((weak, alias("__board_usb_init"))); 一下子懵逼了,啥意思?不懂的东西,还是要查一下的: weak 和 alias 分别是两个属性. weak 使得 foo 这个符号在目标文件中作…