gcc attribute weak & alias应用

1          gcc attribute weak & alias应用

alias ("target")

The alias attribute causesthe declaration to be emitted as an alias for another symbol, which must bespecified. For instance,

void __f () { /* Do something. */; }

void f () __attribute__ ((weak, alias ("__f")));

defines ‘f’ to be a weakalias for ‘__f’. In C++, the mangled name for the target must be used. It is an error if‘__f’ is not definedin the same translation unit.

Not all targetmachines support this attribute.

这段来自GCC官方文档的说明,其实讲了gcc的alias和weak attribute。

1.1        gcc weak attribute

具体语法,大概和一般gcc属性一样,需要用到__attribtes__((weak))这样的格式。现在我们通过一个例子来说明一下。

1 我们在weak_symbol.c这个文件中声明了一个common_print函数,并且将此函数声明为__attribute__((weak));同时提供了此函数的定义。

//weak_symbol.c
#include<stdio.h>
voidcommon_print(const char *s) __attribute__((weak));//有weak声明
voidcommon_print(const char *s)
{
    printf("common_print : %s\n",s);
}

2 在strong_symbol.c这个文件也定义了common_print函数,需要注意的是此函数在两个不同的c文件中声明、定义的原型都一样的。

//strong_symbol.c
#include<stdio.h>

voidcommon_print(const char *s) //没有weak声明
{
    printf("application common_print : %s\n",s);
}
int main(intargc, char *argv[])
{
    common_print("I want to test gcc weakattribute");
    return 0;
}

3 编译连接连个c文件,并且执行的结果如下:

[email protected]:/home/test/gcc_test#./test_weak

applicationcommon_print : I want to test gcc weak attribute

分析:

1)      首先,同样的原型的两个函数在连个不同的c文件中都有定义,把这两个c文件编译、连接在一起,也没有什么错误。原因就是因为,gcc中有一个strong symbol和weak symbol的概念。默认函数定义都是strong symbol的,两个相同的strong symbol连接在一起,肯定会产生”symbol重复定义”的错误。

但是,这里我们将weak_symbol.c中的common_print加了weak属性,这样gcc再选择的时候优先选择strong symbol

2)      其次,根据例子程序执行的结果来看,执行了strong_symbol.c中的common_print函数。如果我们在strong_symbol.c中不提供common_print函数的实现,那么调用的就是weak_symbol.c中的实现。

3)      由上,我们可以想象,当要用c语音提供一个api库的时候,我们可以把这些api都声明为weak属性的,我们可以提供default实现。当用户想要自己定制的时候,也就很容易实现了。glibc中的很多api就是这样设计的。

1.2        gcc weak &alias attribute配合应用的场景

同样,先看一个例子。

1 我们在weak_symbol.c中提供了一个__lib_print函数的实现,同时声明了print_a和print_b两个函数,但是和上面不通的是,这两个函数增加了__attribute__((weak,alias("__lib_print")))熟悉,即print_a和print_b都是__lib_print的别名(alias)。

//weak_symbol.c
#include <stdio.h>

void __lib_print(const char *s)
{
   printf("__lib_print : %s\n", s);
}

void print_a(const char *s) __attribute__((weak, alias("__lib_print")));
void print_b(const char *s) __attribute__((weak, alias("__lib_print")));

2 我们在strong_symbol.c中为print_b重新提供了实现,print_a保持默认不变。

//strong_symbol.c
#include <stdio.h>

void print_b(const char *s)
{
   printf("application print_b : %s\n", s);
}
int main(int argc, char *argv[])
{
   print_a("I want to test weak&&alias");
   print_b("I want to test weak&&alias");

   return 0;
}

3  编译连接连个c文件,并且执行的结果如下:

[email protected]:/hometest/gcc_test#./test_weak

__lib_print : I want to testweak&&alias

application print_b : I want to testweak&&alias

分析:

从执行结果来看,print_a执行的是weak_symbol.c中的__lib_print的实现。print_b执行的是strong_symbol.c中的print_b实现。这个执行结果,我们是应该猜到的,需要说明一点是alias属性可以为一个函数提供很多不同的别名。这样,当我们提供api库的时候,如果多个api有相同的default实现,就可以通过alias机制提供一个default 实现。

gcc attribute weak & alias应用

时间: 2024-11-12 09:43:23

gcc attribute weak & alias应用的相关文章

linux gcc attribute

_attribute__((error("message"))) Declare that calling the marked function is an error. __attribute__((warning("message"))) Declare that calling the marked function is suspect and should emit a warning. __attribute__((deprecated)) Decla

[小技巧] gcc attribute error 属性小试

gcc __attribute__  里有一个属性是 error 能够用于编译时报错. 參考: https://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Function-Attributes.html error ("message") If this attribute is used on a function declaration and a call to such a functionis not eliminated through de

gcc attribute 初始化函数列表

gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的作用. __attribute__的section子项使用方式为: ? 1 __attribute__((section("section_name"))) 其作用是将作用的函数或数据放入指定名为"section_name"的段. 看以下程序片段: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2

Linux gcc支持的语法 __attribute__ 属性设置

__attribute__实际上是gcc专有的一种语法,是用来设置函数属性.变量属性.类属性的 语法:之前在C中的结构体对齐中提到过,当时是用来告诉编译器这个结构体的对齐方式 ,其实他还有很多种用法,可以设置很多的属性.语法: __attribute__ (parameter)对于变量: int a __attribute__ ((xxxxx)) = 10; //也可以放在变量的前面,比较灵活 int a __attribute__ ((xxxxx)); // 也可以放在变量的前面,比较灵活对于

C语言之强化,弱化符号weak

一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① 同名的强符号只能有一个,否则编译器报"重复定义"错误. ② 允许一个强符号和多个弱符号,但定义会选择强符号的. ③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个. 二.哪些符号是弱符号? 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误.比如我们在目

基于Linux下的GCC编译器的内部预宏定义与__attribute__属性

***************************************************************************************************************************** 作者:EasyWave                                                                                    时间:2015.02.20 类别:Linux应用-GCC编

macbook中gcc替换为gnu gcc

macbook中gcc被定义为clang,而正统的gnu gcc却只能使用gcc-7(gcc 7版本),然而,如果修改/usr/bin的链接,还容易造成系统错误,因为mac的工具链和gcc(clang版)高度集成,搜索了一下,发现有高手通过巧用alias来完美的解决了这个问题,而且还可以在需要时,随时undo. 在用户目录下,修改.bash_profile文件 alias gcc="gcc-7" alias cc="gcc-7" alias g++="g+

Mac环境下升级gcc版本--rocksdb

前言 在mac环境下编译rocksdb,需要配置依赖的编译环境,其中有一项比较麻烦:c++编译要支持C++11,但是在mac环境安装xcode-select --install之后,已经安装有了gcc-4.2.1,而且不容易升级,因为已经存在/usr/bin/gcc,想覆盖这个命令文件比较麻烦. OS X: Install latest C++ compiler that supports C++ 11: Update XCode: run xcode-select --install (or

5.24 Declaring Attributes of Functions【转】

转自:https://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html 5.24 Declaring Attributes of Functions In GNU C, you declare certain things about functions called in your program which help the compiler optimize function calls and check your