2020.3.2
在理解论文讲的内容前有必要搞清楚PLT和GOT的结构和作用

搜索的足迹:

2020.3.3
要清楚的了解gcc里的PLT和GOT,就不得不了解清楚C语言extern和static关键字的含义。

看了一遍还是不太懂PLT、GOT、extern、static的详细原理。

PLT和GOT

✔️🤔:怎么保证同一变量在so文件里的GOT和主exe文件的GOT的值一致?或者怎样融合成一个GOT?

:可以从BOOKS/ELF/的两个手册里看到got和plt是用于PIC(位置无关代码)的!且可以做实验看到.got和.plt都是要加载到内存的segments的一部分!所以只会在so里才会有.got和.plt section。这两完成的工作就是间接跳转到主exe文件的变量去,“搭建简介跳转”的工作应该是由动态链接器完成。

extern关键字

网上有很多讲解的文章。以下是我看了后和做的一些实验的总结:

  • 首先回忆起声明(declaration)和定义(definition)的区别;
  • 声明在函数外边的非static变量都是全局变量(global);
  • extern关键字让其他文件(.o或.so)能够在使用这个全局变量的C语言语法变得严谨;
  • 声明(declaration)全局变量时没必要加extern,若加了的话gcc只是会给出warning而已;
  • 因为上一条,所以网上有的文章会说extern变量只能定义(definition)一次,其实就是全局变量只能定义(definition)一次,否则gcc会报错multiple definition;

实验素材和操作如下,

# extern.c
int a = 17;
// extern a = 17; gcc编译时警告initialized and declared ‘extern’

# externMain.c
extern int a; 
// int a; 没有问题,所以我说extern是为了让语法变得严谨
// extern int a = 11; gcc编译时警告initialized and declared ‘extern’,且initialized and declared ‘extern’
// int a = 11; initialized and declared ‘extern’
int main(void){return a;}
gcc extern.c extermMain.c
./a.out
echo $?

论文的内容

JLSCL算法

可包装库函数是能够简单地调用本地库函数且和源库函数有相同效果的库函数。

PLT短路库函数是静态翻译能够搞定的库函数。

(jacket library and shortcut library)

  1. 对涉及到的系统库函数建立分类查询表;
  2. 在静态阶段对主文件及其依赖的共享库中的系统库函数进行翻译;
  3. 在控制转移到动态翻译执行之前,完成动态阶段的装入工作,需要装入内存的内容包括
    1. 源ISA的主文件和系统库,
    2. 静态阶段翻译出来的本地码,包括主文件本地码和系统库本地码,
  4. 在调用库函数时查询第1步建立的查询表,
    1. 若是可包装库函数,则按照可包装库函数执行,
    2. 若是PLT短路函数,则按照PLT短路函数执行,
    3. 否则在目标机上用内存模拟原ISA的寄存器和堆栈,动态翻译执行源库函数。

Digital Bridge Version 2简介

本系统由静态翻译器和动态执行器两部分组成,静态翻译器在程序执行之前,根据profiling结果对X86代码进行翻译优化,得到静态翻译结果,包括翻译后的MIPS本地代码以及一些辅助信息。动态翻译执行器获取这些静态翻译结果后,将X86源二进制代码和静态翻译结果装入内存,并翻译执行源二进制代码,在执行过程中记录profiling结果,供静态翻译器下一次翻译时使用。该系统中动静态翻译交替执行,经过若干次迭代后,被翻译程序趋于稳定,得到质量较高的目标机器本地码。

digital_bridge_2_process_flow