ELF 动态链接与加载

ELF 动态链接与加载

2024 南京大学《操作系统:设计与实现》
ELF 动态链接与加载

实现动态加载器 (2)

实现数据的动态加载和链接

  • main (.o) 访问 stderr (libc.so)
  • libjvm (.so) 访问 stderr (libc.so)
  • libjvm (.so) 访问 heap (libjvm.so)
    • 编译时同样不知道数据在哪里

与代码同样的难题:到底是什么符号

extern int x;
  • 是在同一个二进制文件 (链接时确定)?还是在另一个库中?
2024 南京大学《操作系统:设计与实现》
ELF 动态链接与加载

PLT: 没能解决数据的问题

对于数据,我们不能 “间接跳转”!

  • x = 1, 同一个 .so (或 executable)
mov $1, offset_of_x(%rip)
  • x = 1, 另一个 .so
mov GOT[x], %rdi
mov $1, (%rdi)

不优雅的解决方法

  • -fPIC 默认会为所有 extern 数据增加一层间接访问
    • __attribute__((visibility("hidden")))
2024 南京大学《操作系统:设计与实现》