相关疑难解决方法(0)

流程链接表和全局偏移表

我正在阅读有关PLT(流程链接表)和GOT(全球抵消表)的这篇文章.虽然PLT的目的对我来说很清楚,但我仍然对GOT感到困惑.我从文章中了解到,GOT仅对于extern在共享库中声明的变量是必需的.对于static在共享库代码中声明的全局变量,它不是必需的.

我的理解是正确的,还是我完全忽略了这一点.

c linux gcc x86-64

11
推荐指数
1
解决办法
1万
查看次数

ARM在Linux内核中注册r9

"ARM体系结构过程调用标准"(AAPCS/EABI)声明(5.1.1)

"The role of register r9 is platform specific."
Run Code Online (Sandbox Code Playgroud)

"A virtual platform [...] may designate r9 as an additional callee-saved
 variable register, v6."
Run Code Online (Sandbox Code Playgroud)

问题是:Linux内核是否将r9用于特殊用途?或者它是否用作普通的非易失性寄存器?

arm abi cpu-registers linux-kernel

6
推荐指数
1
解决办法
1152
查看次数

使用 ld 创建非 PIC 共享库

我有一堆在没有该-fPIC选项的情况下编译的目标文件。因此对函数的调用不使用@PLT. (源代码是 C 语言并用 编译clang)。

我想将这些对象文件链接到一个共享库中,我可以使用dlopen. .so我需要这样做,因为在加载实际内容之前我必须进行大量设置。

但每次我尝试链接该-shared选项时,都会收到错误 -

创建共享库时不能使用R_X86_64_PC32针对符号的重定位;splay_tree_lookup重新编译-fPIC

我从源代码重新编译没有任何问题。但我不想使用-fPIC. 这是我们正在开发自定义编译器的研究项目的一部分。PIC 不适用于我们试图在编译器中提供的保证类型。

是否有一些我可以使用的标志,ld以便它生成加载时重定位库。事实上,我没有搬家,也没什么问题。我可以为库提供基地址,dlopen如果虚拟地址不可用,则可能会失败。

我用来编译c文件的命令相当于 -

clang -m64 -c foo.c
Run Code Online (Sandbox Code Playgroud)

为了链接我正在使用

clang -m64 -shared *.o -o foo.so
Run Code Online (Sandbox Code Playgroud)

我说等效是因为它是一个自定义编译器(forked off clang)并且有一些额外的步骤。但它是等价的。

c linux linker ld

6
推荐指数
1
解决办法
2399
查看次数

*(int32_t *)(a + 4)= b是什么意思?

我已经.so使用retdec反编译了一个文件(来自Android应用程序中的ARM库),并且在代码中可以找到类似的指令:

int32_t a = `some value`;
int32_t b = `another value`;
*(int32_t *)(a + 4) = b;
Run Code Online (Sandbox Code Playgroud)

由于以任何值运行此命令都会在编译时产生警告,并且在运行时出现分段错误,因此我不确定它的实际作用。

c arm decompiling reverse-engineering

1
推荐指数
1
解决办法
185
查看次数