当前位置: 首页 > article >正文

深入Os--静态链接

1.一个实例

#include <iostream>

int main()
{
    printf("main\n");
    return 0;
}

执行:g++ -std=c++11 main.cpp,我们得到a.out
执行:objdump -dx a.out > 1.txt,查看1.txt。
截取以下信息:
在这里插入图片描述
在这里插入图片描述
我们上述简单的实例可执行程序引用了来自C库的符号printf
这里的C库是动态库,程序执行时如何通过callq找到printf符号定义位置属于动态库引用重定位范畴。

2.一个扩展的实例

// main.cpp
#include <iostream>
extern "C" int fun(int i, int j);
int main()
{
    printf("main\n");
    printf("1+2=%d\n", fun(1,2));
    return 0;
}

// func.cpp
extern "C" int fun(int i, int j)
{
    return i+j;
}

执行:g++ -std=c++11 func.cpp -c得到func.o。
执行:g++ -std=c++11 main.cpp -c得到main.o
执行:objdump -dx main.o > 1.txt,查看1.txt。
截取以下信息:
在这里插入图片描述
上述main.o中引用了符号fun。但1.txt中并不包含符号fun的定义。

我们继续执行:g++ -std=c++11 main.cpp fun.cpp
执行:objdum -dx a.out > 11.txt,查漏11.txt。
截取以下信息:
在这里插入图片描述
在这里插入图片描述
可以看到此时有两处改变:
(1).引用符号fun处,由0xe8 00 00 00 00变为0xe8 6a 00 00 00。
(2).fun符号的定义被拷贝到可执行文件a.out内代码段内了。

上述两处改变正是静态链接所作的工作。
(1).将符号引用对应到符号定义。
(2).将符号定义拷贝到可执行文件内。


http://www.kler.cn/a/154954.html

相关文章:

  • 数据库范式、MySQL 架构、算法与树的深入解析
  • 浅谈“通感一体”
  • 2024 年(第 7 届)“泰迪杯”数据分析技能赛B 题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享
  • 基于Python 和 pyecharts 制作招聘数据可视化分析大屏
  • golang使用etcd版本问题
  • 第四十五章 Vue之Vuex模块化创建(module)
  • RabbitMQ 笔记
  • C#拼夕夕自动化登录,电商网页自动化操作。WebView2
  • CSS 选择器优先级,!important 也会被覆盖?
  • 堆排序算法
  • 选股的重要性、考虑的因素
  • MySQL-视图
  • 【学习笔记】GAN实战(基础)
  • 动态规划学习——回文串
  • day4 找到两个链表的交点
  • 用友U8 ERP和面粉行业专版系统接口集成方案
  • 国产AI边缘计算盒子,双核心A55丨2.5Tops算力
  • 怎么用SSH远程连接Ubuntu服务器
  • 【Unity动画】状态机添加参数控制动画切换(Animator Controller)
  • C# WPF上位机开发(计算器界面设计)
  • Oracle连接和使用
  • Java高级技术-反射
  • 02_线程通信与线程池
  • H265、VP9、AV1视频编码器性能对比
  • 22.Oracle中的临时表空间
  • 短线买入卖出有哪些交易技巧?