[英]Force entries in PLT section
由于某些原因,我想强制在PLT部分中输入一些内容。 我已经设法对某些条目执行此操作,但是某些功能从未插入PLT中。
因此,可以说我有main.c
:
int main(){
// some code
strcmp(a,b); //suppose a, b strings
// more code
// suppose that result of strcmp is used, so it won't be optimised away
}
和help.c
:
// declaration
void forceplt() __attribute__((__used__));
// definition
void forceplt(){
abs(-1);
__aeabi_dadd(0, 0);
}
然后,我将以上两个可重定位的对象编译并链接到一个可执行对象中。 为了确保abs
和dadd
函数将保留在PLT部分中,我使用-O0
编译helper.o
。 main.o
可以进行更高级别的编译,比方说`-O1'。
我希望在可执行对象上看到所有3个函数的条目: strcmp
, abs
和dadd
。 然而,这种情况并非如此。
我在这里想念什么吗? 链接器是否可能因为发现它们从未被调用而忽略了某些东西? 尽管使用O0作为辅助函数,并使用了forceplt函数的属性?
帮我适当地庆祝..十。 百万。 问题!
干杯!
abs
和strcmp
被GCC特别识别,似乎编译器发现这些调用即使在-O0
也无用。 如果查看generate程序集( gcc foo.c -S -o-
),则会看到没有相应的调用指令。
PLT条目不是由编译器生成的:它们不在.o
文件中。 当它们在输入的.o
文件之一中找到对应的重定位时,它们由链接编辑器生成。 为了生成PLT条目,您需要在一个输入.o
文件中生成一个合适的重定位条目。 .o
重定位始终适用于.o
文件的一部分:您需要在某些.o
某些部分中具有一些内存字节,然后使用支持PLT的重定位进行重定位。 它可以通过(可能无用)指令或其他一些字节(可能无用)来实现。
一种解决方案是创建(汇编)明确使用预期的PLT条目的指令。 使用x86_64可以通过以下方式完成:
.text
.type forceplt2,@function
forceplt2:
callq abs@plt
我猜它是这样写的:
.text
.type forceplt2,%function
forceplt2:
bl abs@plt
或者,您可以为重定位生成原始字节(再次在x86_64上):
.data
.align 8
.type forceplt3, @object
.size forceplt3, 8
forceplt3:
.quad socket@GOTPLT
在x_86_64上 ,您应该可以使用@GOT
@GOTPLT
, @GOTOFF
@GOTPCREL
, @PLT
@GOTOFF
, @GOTPCREL
, @PLT
或@PLTOFF
。 我不太确定该如何为ARM编写。
这些解决方案中的任何一个都会发出合适的重定位条目,这将导致链接编辑器发出PLT条目和PLT GOT条目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.