首页 > 解决方案 > 加载程序是否在 linux 中执行符号重定位?

问题描述

我认为只有链接器会重新定位符号,这样一旦我们得到一个可执行对象文件(a.out),符号的逻辑地址就不会改变。但是,根据我的实验,情况似乎并非如此:

我写了一个简单的代码:

#include <stdio.h>                                                              
                                                                                
int main(void) {                                                                
    printf("address of main: %p\n", &main);                                     
}  

并将其编译为可执行文件 a.out。

每次我运行相同的可执行文件时,都会得到不同的结果,这里有一些示例:

address of main: 0x55bb9c80064a
address of main: 0x55940760064a

所以我想知道这是否意味着加载程序在将程序加载到内存时会进行另一个符号重定位?

我的环境:Ubuntu 18.04.5 LTS + gcc。

标签: linuxcompilationlinkerloader

解决方案


推荐阅读