动态加载过程与 PLT、GOT 表

(TODO 补充关于编译时重定位、运行时重定位、PLT/GOT 表的背景知识) 本文将展示动态加载的过程,相关函数的地址如何在运行时被重定位,以及 PLT/GOT 表在其中的发挥的作用。以下面这段代码为例: 1#include <stdio.h> 2 3int main() 4{ 5 printf("Hey man!\n"); 6 return 0; 7} 编译 之前着实没想到,为了更好地展现 PLT/GOT 的过程,要在编译这块做这么多额外工作。 首先要添加 -fno-pie 和 -no-pie 两个选项,否则 GOT 里的函数地址会在 main() 执行前就被调整好,原本的过程就体现不出来了。这是从这 …

一个由动态库对其他动态库的依赖导致的问题

感觉难以解决的编译问题大多是链接的问题,其中大多是动态链接的问题,而这其中又大多是涉及要加 -l 选项的动态库的动态链接问题。 问题场景 编译可执行程序 UnitTest 时报错: 1Scanning dependencies of target UnitTest 2[ 16%] Building CXX object CMakeFiles/UnitTest.dir/test/unit_test.cpp.o 3[ 33%] Linking CXX executable UnitTest 4/home/ubuntu/project/build/libA.so: undefined reference to `dlopen' …

ELF 调试器示例代码

这份调试器的示例代码来自《Learning Linux Binary Analysis》 书中第三章的“A simple ptrace-based debugger”一节,添加了一些调试打印和关于代码细节的注释。其他相关内容可查阅此书。 1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#include <unistd.h> 5#include <fcntl.h> 6#include <errno.h> 7#include <signal.h> 8#include …

Check What Libraries an ELF Depends On

Immediate Dependencies Only 1objdump -x a.out | grep NEEDED # or -p 2 3 NEEDED libstdc++.so.6 4 NEEDED libgcc_s.so.1 5 NEEDED libc.so.6 Alternative: 1readelf -d a.out | grep NEEDED 2 3 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6] 4 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1] 5 …