繁体   English   中英

在PLT部分中强制输入

[英]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);
}

然后,我将以上两个可重定位的对象编译并链接到一个可执行对象中。 为了确保absdadd函数将保留在PLT部分中,我使用-O0编译helper.o main.o可以进行更高级别的编译,比方说`-O1'。

我希望在可执行对象上看到所有3个函数的条目: strcmpabsdadd 然而,这种情况并非如此。

我在这里想念什么吗? 链接器是否可能因为发现它们从未被调用而忽略了某些东西? 尽管使用O0作为辅助函数,并使用了forceplt函数的属性?

帮我适当地庆祝..十。 百万。 问题!

干杯!

absstrcmp被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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM