我下面有3个示例代码(所有.so文件):
1)
test = list1.replace("dfc", "")
2)
int myglob = 42;
int fun(int a, int b)
{
return myglob + a + b;
}
3)
static int myglob = 42;
int fun(int a, int b)
{
return myglob + a + b;
}
在这三种情况下,重新安置如何运作?它们彼此有什么不同?
我的猜测:
由于第三种情况中的extern int myglob;
int fun(int a, int b)
{
return myglob + a + b;
}
为myglob
,因此它使用extern
表。
在第二种情况下,我认为我们不需要使用GOT表,因为在对象本身中定义了GOT
,并且链接器知道myglob
和{{之间的偏移量1}}部分,因此我们可以将已知的偏移添加到当前指令指针,以访问数据部分中的.text
。
第一个在文件范围中声明,并且不指定存储类,然后默认为外部链接。所以这应该与第三种情况类似。
我说错了吗?