简单的说,就是当发生 “重复定义的时候”.被声明者会被冲突者覆盖掉. 这里还涉及了weak与alias连用的情况. 参见,里边有两个例子,很浅显易懂. https://my.oschina.net/senmole/blog/50887 还有一个用法是,让未定义的函数在没实现的情况下,不影响程序的编译. 我自己写了个例子,如下: [root@D128 examples]# cat test.c #include <stdio.h> #include <stdint.h> #ifdef…
弱符号是什么? 弱符号: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误.链接器会忽略弱符号,去使用普通的全局符号来解析所有对这些符号的引用,但当普通的全局符号不可用时,链接器会使用弱符号.当有函数或变量名可能被用户覆盖时,该函数或变量名可以声明为一个弱符号.弱符号也称为weak alias(弱别名). attribute((weak))的作用 情况是这样的,碰到一个棘手的问题:我们不确定外部模块是否提供一个函…
参考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…
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内核代码时,表现了一些编译器选项如__attribute_((weak)).__attribute__( (alias("target"))),一开始不了解,后来自己查看资料及书籍算是对gcc的这个编译属性有了一定的认识. 一.先了解weak属性. __attribute__((weak))表示为弱符号属性,所谓的弱符号是针对于强符号来说的,我们定义的全局已初始化变量及全局函数等都是属于强符号,在链接时如果有多个强符号就会报错误:而弱符号主要指未初始化的全局变量或通过…
一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① 同名的强符号只能有一个,否则编译器报"重复定义"错误. ② 允许一个强符号和多个弱符号,但定义会选择强符号的. ③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个. 二.哪些符号是弱符号? 我们经常在编程中碰到一种情况叫符号重复定义.多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误.比如我们在目…
很多东西,只看看是不行的,要想深入的去了解一个东西,一定要去不断地学习,实践,反思. 说白了就是要去打磨. 在linux中,最近遇到了这样一个定义: int board_usb_init(int index, int usb_init_type) __attribute__((weak, alias("__board_usb_init"))); 一下子懵逼了,啥意思?不懂的东西,还是要查一下的: weak 和 alias 分别是两个属性. weak 使得 foo 这个符号在目标文件中作…
__attribute__实际上是gcc专有的一种语法,是用来设置函数属性.变量属性.类属性的 语法:之前在C中的结构体对齐中提到过,当时是用来告诉编译器这个结构体的对齐方式 ,其实他还有很多种用法,可以设置很多的属性.语法: __attribute__ (parameter)对于变量: int a __attribute__ ((xxxxx)) = 10; //也可以放在变量的前面,比较灵活 int a __attribute__ ((xxxxx)); // 也可以放在变量的前面,比较灵活对于…
一.强符号和弱符号 在C语言中,如果多个模块定义同名全局符号时,链接器认为函数和已初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 根据这个定义,Linux链接器使用下面的规则来处理多重定义的符号名: 1.不允许有多个同名的强符号 2.如果有一个强符号和多个弱符号同名,那么选择强符号 3.如果有多个弱符号同名,有些编译器从这些弱符号中任意选择一个,有些编译器选择占用内存最大的那个符号 符号链接原理:链接器发现同时存在弱符号和强符号,优先选择强符号,如果发现不存在强符号…
__attribute__可以设置函数属性(Function Attribute).变量属性(Variable Attribute)和类型属性(Type Attribute) __attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数 1. 变量别名: 语法:type newname __attribute__((alias("oldname"))); #include <stdio.h> ; extern int…
一 符号概念: 在C语言中,有强符号和弱符号,符号简单来说就是函数.变量的名字,对于全局(非局部.非static)的函数和变量,能不能重名是有一定规矩的,强.弱符号就是针对这些全局函数和变量来说的. 二 声明方法: 1 使用__attribute__((weak))修饰: // function declaration int __attribute__((weak)) power2(int x); // or int power2(int x) __attribute__((weak)); /…
目录 1. weak 2. aligned 3. __packed__ 4. always_inline 1. weak 实现如果 Func1 被定义了,我就调用 Func1, 否则就调用 MyFunc1 . static void MyFunc1(/*...*/) { // do something... } void Func1(/*...*/)__attribute__((weak)); int main() { if (Func1) Func1(/*...*/); else MyFunc…
当定义CONFIG_CMD_NET和CONFIG_CMD_PING,编译之后执行ping命令,告警没有找到以太网. 因此,需要打开U-boot的网络功能, u-boot-sunxi-sunxi中没有找到明显的网络驱动代码,或许有通用的驱动,但可以获得资料的途径有限,再说我是个初学者,平时工作属于自动控制类,网络方面很菜,因此想通过修改一个网络驱动,进行一次初步学习,想到就开工... 边做边写,恐怕会比较乱. 开发环境:   1.笔记本RHEL5,安装编译器arm-none-eabi-版本4.7.…
How can you add extra hardware UARTs to a 32bit TMS470 ARM7-based microcontroller at zero cost? Solution: Designers can use the high-end timer (HET) peripheral found on all Texas Instruments ARM7-based, 32-bit TMS470 microcontrollers to implement add…
原创: To_run_away 从零开始学linux 本节的开始之前,先看一下uboot的链接脚本. 一.链接脚本 /* * Copyright (c) 2004-2008 Texas Instruments * * (C) Copyright 2002 * Gary Jennejohn, DENX Software Engineering, <garyj@denx.de> * * SPDX-License-Identifier:  GPL-2.0+ */ #include <confi…
转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号. 对于它们,下列三条规则使用: ① 同名的强符号只能有一个,否则编译器报"重复定义"错误. ② 允许一个强符号和多个弱符号,但定义会选择强符号的. ③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个. 二.哪些符号是弱符号? 我们经常在编程中碰到一种情况叫符…
一开始写Arduino 的时候很不习惯,没有main函数,因为好多东西都被隐藏了.一直想搞清楚,以便编写自己的库文件.于是研究一下午,下面是一些总结. Arduino工程的初步认识 一.目录规范 当你创建一个空的工程,先按下ctrl+s保存一下.这个时候弹出对话框,命名工程.假如命名为LED,并保存在 我自己的Arduino工作目录下  H:\Arduino\workspace\ 于是IDE会自动帮我们在workspace下创建1个文件夹,并将sketch主文件放在里面,而且主文件和文件夹同名.…
#ifndef Arduino_h #define Arduino_h #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <math.h> #include <avr/pgmspace.h> #include <avr/io.h> #include <avr/interrupt.h> #include "binary.h&q…
延续上一篇, 烧录完成后, 串口屁毛都没有了, 运行了代码比较工具, 看看问题在哪. board/100ask24x0/   没有问题, 除了lowlevel_init.S, 不过我没在uboot中用到网卡, 不用理会先. 再次编译居然出错了: 100ask24x0.c: In function `board_init':100ask24x0.c:12: warning: unused variable `clk_power'100ask24x0.c: In function `board_fl…
目录 . 引言 . C/C++运行库 . 静态Glibc && 可执行文件 入口/终止函数 . 动态Glibc && 可执行文件 入口/终止函数 . 静态Glibc && 共享库 入口/终止函数 . 动态Glibc && 共享库 入口/终止函数 . 静态库/共享库->编译/使用.动态加载 . 和静态库/动态库相关的辅助工具 1. 引言 0x1: glibc Any Unix-like operating system needs a C…
相关学习资料 linux内核设计与实现+原书第3版.pdf(.3章) 深入linux内核架构(中文版).pdf 深入理解linux内核中文第三版.pdf <独辟蹊径品内核Linux内核源代码导读> http://www.yanyulin.info/pages/2013/11/linux0.html http://blog.csdn.net/ddna/article/details/4958058 http://www.cnblogs.com/coolgestar02/archive/2010/…
转自: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…
用数组chain[4]描述四种不同的索引,即直接索引.一级间接索引.二级间接索引.三级间接索引.举例说明这个结构各个域的含义.如果文件内的块号为8,则不需要间接索引,所以只用chain[0]一个Indirect结构,p指向直接索引表下标为8处,即&inode->u.ext2_i.i_data[8]:而key则持有该表项的内容,即文件块号所对应的设备上的块号(类似于逻辑页面号与物理页面号的对应关系):bh为NULL,因为没有用于间接索引的块.如果文件内的块号为20,则需要一次间接索引,索引要用…
最近在看一些源代码,遇到了一些使用__attribute__修饰函数和变量的属性方面的代码,不是太了解,很是汗颜,再此做个总结:   GCC使用__attribute__关键字来描述函数,变量和数据类型的属性,用于编译器对源代码的优化. 描述函数属性的几个重要的关键字:   void noreturnfun() __attribute__((noreturn));//函数不会返回. void centon() __attribute__((alias("__centon")));//设…
__attribute__机制是GNU C的一大特色,可以用来设置函数,变量和数据类型的属性,下面对工作中正好用到的两个属性做下简单介绍. 1. constructor 这个属性指定函数在main函数执行之前执行 static void RunBeforeMain(void) __attribute__ ((constructor)); void RunBeforeMain(void){ printf(“%s \n”, __FUNCTION__); } int main(void){ print…
使用qtcreator加androidndk编译项目时报错: error: qrc_qml.obj: requires unsupported dynamic reloc R_ARM_REL32; recompile with -fPIC error: undefined reference to '__dso_handle' 解决方案,建一个头文件,代码如下,包含到项目里: #define NS_EXPORT extern "C" {/* * To work around http:…
瘋耔新浪微博:   http://weibo.com/cpjphone 一: 1◑ 从链接脚本文件u-boot.lds('/opt/4418-source/android/u-boot' )中可以找到代码的起始: OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_stext) SECTIONS { . = 0…