动态加载过程与 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' …

Search Paths for Dynamic Linking & Loading

Before we start When talking about “dynamic linking”, people could refer to any of the following two processes: one is a step of program’s construction, where (relocatable) object files are dynamically linked by the linker – a toolchain’s component; the other is a pre-processing stage of …

记一次 Android Native 层的 Debug 过程

记录这次 Debug 的原因主要是在 debug 过程中用到了之前写的另一篇贴文 所描述的一些做法,并且整个过程也比较曲折,其中的一些现象及其背后的原因也比较罕见。 先给个简单的 Takeaway:如果发生了段错误但 Logcat 中没有打印堆栈,可以考虑一下“人为捕获了 SIGSEGV 信号,但挂接的处理函数出错崩溃”这种情况。 问题现象 当时是在协助开发某 Android 底层框架 A 的新版本。在某次合入新代码后进行测试,发现其上层 App 在运行时会发生“必现但时间及场景不定”的崩溃。比较奇怪的是,Logcat 中完全没有打印 App 崩溃时的错误类型或堆栈信息。 原因定位 后面在 Logcat 中找到的一些边缘信息指出,崩 …

用 GDB 调试动态链接库

前言 写本文的目的是为了记录一个【基于 GDB 对动态链接库(DSO1)的错误进行调试】的过程,重要的内容包括: 获取进程发生错误时的状态; 查看进程在该状态下的内存分布; 在 GDB 中用正确地址加载符号表,以恢复函数调用堆栈。 本文主要参考了 Ubuntu Wiki 上的这篇博文 。按照其版权及许可证要求,本文采用 Creative Commons Attribution-ShareAlike 3.0 进行许可。 Hybris 简介 Libhybris 是一种关于 libc 库兼容问题的解决方案,让我们在基于 GNU C Library (Glibc)的系统上2可以运行用 Bionic 编译的库(主要是 Android …