2012年12月26日

弱引用和强引用

摘要: 如果目标文件对外部目标文件符号进行强引用,但在链接成可执行文件时不能被正确的决议(好奇怪的名称,看看p_51),链接器就会报错,这是对于强引用(Strong Reference)而言的。与之相对应还有一种弱引用(Weak Reference),在处理弱引用时,如果该符号有定义,则链接器将对该符号的引用进行决议,如果该符号未被定义,则链接器对于该引用不报错。链接器处理强引用和弱引用的过程几乎一样,但是对于未定义的弱引用,链接器不认为它是一个错误;一般,对于未定义的弱引用,链接器默认其值为0,或者是一个特殊值,以便于程序代码能够识别。弱引用和弱符号主要用于库的链接过程。在GCC中,使用__attr 阅读全文

posted @ 2012-12-26 22:07 阿加 阅读(1934) 评论(0) 推荐(0) 编辑

弱符号与强符号

摘要: 多个目标文件中含有相同名字全局符号的定义,那么这些目标文件链接的时候将会出现符号重复定义的错误。比如我们在目标文件A和目标文件B都定义了一个全局整形变量global,并将他们都初始化,那么链接器将A和B进行链接时会报错。这种符号的定义可以被成为强符号(Strong Symbol)。有些符号的定义可以被称为弱符号(Weak Symbol)。对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。通过GCC的"__attribute__((weak))"可以定义任何一个强符号为弱符号。强符号和弱符号都是针对定义来说的,不是针对符号的引用。 阅读全文

posted @ 2012-12-26 22:05 阿加 阅读(487) 评论(0) 推荐(0) 编辑

符号修饰与函数签名

摘要: p_87Linux下的GCC编译器中,默认情况下已经去掉了在C语言符号前加"_"的方式,但是Windows平台下的编译器还保持着在符号前加"_"的习惯。函数签名使得函数在目标文件中的符号变成与其源文件的函数名、函数参数、所在的类和名称空间及其它信息关联了起来。函数签名经名称修饰变成修饰后名称目标文件中的符号名,变量亦如此。c++filt工具可以用来解析被修饰过的名称,比如:c++filt _ZN1N1C4funcEi输出:N::C::func(int)C++为了与C兼容,在符号管理上,C++有一个用来声明或定义一个C符号的"extern &qu 阅读全文

posted @ 2012-12-26 17:58 阿加 阅读(249) 评论(0) 推荐(0) 编辑

strtab symtab shstrtab

摘要: 关于.strtab,.symtab,.shstrtab.strtab是字符串表(STRING TABLE).shstrtab是段表字符串表(Section Header String Table),针对段表.symtab是符号表,一般是变量、函数shstrtab及symtab经常引用strtab中的字符串。ld链接脚本中将会定义很多特殊的符号,这些符号并没有在你的程序中定义,但是你可以直接声明并应用,我们称之为特殊符号。查看ld的默认链接脚本:ld -verbose对于这些特殊符号,我们不必定义它,只需声明引用即可使用。链接器会在将程序最终链接成可执行文件的时候将其解析成正确的值,只有在使用l 阅读全文

posted @ 2012-12-26 17:40 阿加 阅读(4453) 评论(0) 推荐(1) 编辑

导航