- 2
- 0
- 约2.05千字
- 约 5页
- 2017-02-23 发布于四川
- 举报
链接器如何定义多处解析的全局符号
链接器如何定义多处解析的全局符号基本介绍:在编译时,编译器输出每个全局符号给汇编器,或者是强(strong),或者是弱(weak),而汇编器把这个信息隐含地编码在可重定位目标文件的符号表里。函数和以函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。我们也可以通过GCC的__attribute__((weak))来定义任何一个强符号为弱符号。注意,强符号和弱符号都是针对定义来说的,不是针对符号的引用。比如我们有下面这段程序:extern int ext;int weak;int strong = 1;__attribute__((weak)) weak2 = 2;int main(){return 0;}weak,weak2是弱符号。strong,main是强符号,而ext既非强符号也非弱符号。因为它是一个外部变量的引用。针对强弱符号的概念,链接器就会按如下规则处理与选择被多次定义的全局符号:规则1:不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号);如果有多个强符号定义,则链接器报符号重复定义错误。规则2:如果一个符号在某个目标文件中是强符号,在其他文件中都是弱符号,那么选择强符号。规则3:如果一个符号在所有目标文件中都是弱符号,那么选择其中占用空间最大的一个。比如目标文件A定义全局变量global为int型,占4个字节;目标文件B定义global为double型,占8个字节,那么目标文件A和B链接后,符号global占8个字节(尽量不要使用多个不同类型的弱符号,否则容易导致很难发现的程序错误)。示例:1. //bar.cint main(){return 0;} //foo.cint main(){return 0;}链接器将生成一条错误信息:$ gcc foo.c bar.c /tmp/ccgVHUSN.o: In function `main:bar.c:(.text+0x0): multiple definition of `main/tmp/ccCZ9xqQ.o:foo.c:(.text+0x0): first defined herecollect2: ld returned 1 exit status因为强符号main被定义了多次(规则1)。2.修改一下://foo.cint x = 2;int main(){return 0;}//bar.cint x = 1;void f(){}$ gcc foo.c bar.c /tmp/cczbmyHW.o:(.data+0x0): multiple definition of `x/tmp/ccsAcjCn.o:(.data+0x0): first defined herecollect2: ld returned 1 exit status因为强符号x被定义了多次(规则1)。3.如果在一个模块里x未被初始化,那么链接器将安静的选择定义在另一个模块中的强符号(规则2)。//bar.cint x;void f(){x = 100;}//foo.cint x = 2;void f();int main(){f();printf(x = %d\n,x);return 0;}运行结果:x = 100。在运行时,函数f将x的值由2改为100。要注意这种情况。4.如果x有两个弱定义,也会发生相同的事情。(规则3)//foo.cint x;void f();int main(){x = 2;f();printf(x = %d\n,x);return 0;}//bar.cint x;void f(){x = 100;}5.当两个重复的符号类型不同时://bar.cdouble x;void f(){x = -0.0;}//foo.cint x = 1;int y = 2;void f();int main(){f();printf(x = %x,y = %x\n,x,y);return 0;}$ gcc bar.c foo.cfoo.c: In function ‘main’:foo.c:9: warning: incompatible implicit declaration of built-in function ‘printf’/usr/bin/ld: Warning: alignment 4 of symbol `x in /tmp/ccVLU2rl.o is smaller than 8 in /tmp/ccUQq1xX.o/usr/bin/ld: Warning: size of symbol `x changed from 8 in /tmp/ccUQq1xX.o to 4 in /tmp/ccVLU2rl.o$ ./a.out x = 0,y
您可能关注的文档
- 2019-2020年六年级鸡兔同笼典型练习题.doc
- 2019-2020年六年级(上册)数学期末综合测试卷.doc
- 托福写作与新八股的共同点.docx
- 2019-2020年六年级(上册)数学期末综合测试卷附命题说明.doc
- 钢丝绳断绳原因及预防措施.doc
- 2019-2020年六年级(上)数学期中试卷.doc
- 2019-2020年六年级(上)语文复习卷.doc
- 钢材购销合同(采购)修改.docx
- 2019-2020年六年级(上)语文期终考试试卷.doc
- 2019-2020年六年级(下册)期末教学质量水平测试试卷附答案命题意图.doc
- 2023年度十大热点人物的素材解读与运用-2024年高考语文作文热点素材积累运用与(全国通用).pdf
- 格力室外机中央空调价格表.pdf
- 2026上半年贵州事业单位联考贵州省交通运输厅招聘84人备考题库完整答案详解.docx
- 2026上半年贵州事业单位联考贵州传媒职业学院招聘12人备考题库附参考答案详解(达标题).docx
- 2026上半年贵州事业单位联考贵州省住房和城乡建设厅招聘16人备考题库含答案详解(培优).docx
- 2026上半年贵州事业单位联考玉屏侗族自治县招聘41人备考题库及答案详解(夺冠系列).docx
- 通信原理实验2数字频带传输系统实验.pdf
- 2026上半年贵州事业单位联考贵州医科大学第二附属医院招聘22人备考题库含答案详解(能力提升).docx
- 2026上海复旦大学计算力学与人工智能交叉研究院(筹)招聘专任研究员2人备考题库完整答案详解.docx
- 2026上半年贵州事业单位联考贵州民族大学招聘52人备考题库附参考答案详解(研优卷).docx
原创力文档

文档评论(0)