【问题标题】:Force entries in PLT section在 PLT 部分强制输入
【发布时间】:2015-08-20 20:15:32
【问题描述】:

出于某种原因,我想在 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.omain.o 可以用更高级别编译,比如说`-O1'。

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

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

帮我好好庆祝一下……十岁。百万。问题!

干杯!

【问题讨论】:

    标签: c compilation linker objdump object-files


    【解决方案1】:

    absstrcmp 被 GCC 专门识别,编译器似乎发现即使在 -O0 中这些调用也是无用的。如果查看生成程序集(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
    

    我猜它在 ARM 中是这样写的:

      .text
      .type forceplt2,%function
    forceplt2:
      bl abs@plt
    

    或者您可以为重定位生成原始字节(再次在 x86_64 上):

       .data
       .align  8
       .type   forceplt3, @object
       .size   forceplt3, 8
     forceplt3:
       .quad   socket@GOTPLT
    

    On x_86_64,您应该可以使用@GOT@GOTPLT@GOTOFF@GOTPCREL@PLT@PLTOFF。我不太确定这应该怎么写for ARM

    这些解决方案中的任何一个都会发出一个合适的重定位条目,这将导致链接编辑器发出一个 PLT 条目和一个 PLT GOT 条目。

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 2021-07-05
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      相关资源
      最近更新 更多