标签:模块 计算机系 变成错误 表示 cpp sha 赋值 ble 链接器
链接器如何解析多重定义的全局符号(不过我在vs2015 c++ 下发现并没有区分强弱符号,反正符号就是不能重定义。)
//aa.c int x=1000;//强符号 //bb.c int a;//弱符号 所以此时选aa.c的强符号 //cc.c int c; //dd.c int c; 所以此时任选。
规则2,3可能会造成一些问题,尤其是如果重复定义的符号定义还有不同的类型时。eg x在一个模块中定义为int,在另一个模块中定义为double
//aa.c int y=1; int x=456; //bb.c double x;
void a()
{
x=-0.0;
x86-64/linux上,double是8个字节,int 是4个字节。所以在我们系统中,x的地址是0x601020,y的地址是0x601024。(栈顶在上,方向向低地址)。因此,bb.c中的赋值x=-0.0将用负0的双精度浮点表示覆盖内存中x和y的位置。
使用GCC-fno-common 标志,在遇到多重定义的全局符号时,触发一个错误。
使用-Werror 标志。会把所有的警告变成错误。
链接器如何解析多重定义的全局符号(强弱符号)------深入理解计算机系统
标签:模块 计算机系 变成错误 表示 cpp sha 赋值 ble 链接器
原文地址:https://www.cnblogs.com/l2017/p/10199259.html