gpt4 book ai didi

Linux环境下:程序的链接,装载和库[静态链接]

转载 作者:我是一只小鸟 更新时间:2023-02-04 22:31:06 24 4
gpt4 key购买 nike

看以下例子 main.c 。

                        
                          extern int x;

int main()
{
    int y = 100;
    swap(&x,&y);
    return 0;
}

                        
                      
                        
                          int x = 1;

void swap(int* x, int* y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

                        
                      

段的合并

main.o swap.o 。

链接生成静态库: ld main.o swap.o -e main -o stlink 将多个目标链接生成可执行文件,默认好像是静态链接 。

可以看到生成的stlink的 .text .data 的大小是原先两个文件之和。2c + 2c = 58 。

重定位

main.o 反汇编 objdump -d -s main.o swap.o 通过 objdump -r main.o 查看目标文件中有哪些是需要重定位的符号 可以看到main.o中的 .text 段有两个符号需要重定位,一个是参数x,一个swap函数, OFFSET分别是17和21 。从相应的从main.o 反汇编中可以看到这两个offset处的地址都是 00 00 00 00 是因为在生成main.o的时候还无法确认这些符号的位置(中间b8也是00.. 是为啥?)。 通过 readelf -s main.o 也可以得到相同的结果(图中的x和swap是UNDEFINED的) 重定位后 objdump -d -s stlink 可以上面需要relocate的位置已经被替换了 参数x 替换成了 600198 这个对应合并后 .data 段的绝对地址。 函数swap则是使用的相对寻址 绝对地址是400114, 相对地址=下一定要执行的地址和真实swap地址的偏移(400114-40010d=7) 。

最后此篇关于Linux环境下:程序的链接,装载和库[静态链接]的文章就讲到这里了,如果你想了解更多关于Linux环境下:程序的链接,装载和库[静态链接]的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com