GCC结构变量分配优化和PLT参考

时间:2018-07-27 08:32:41

标签: c gcc

我需要一些有关GCC优化行为的帮助,该行为会在检测到存在结构变量分配时插入对memcpy的调用。

我有以下示例代码:

struct foo_t {
        int x[1048576];
} *foo0, *foo1;

void bar(struct foo_t* foo)
{
        *foo1 = *foo;
}

int main()
{
        return 0;
}

# /usr/src/gcc-6.1.0/build/bin/gcc -fPIE -S b.c

这导致GCC编译器在函数bar1中发出对memcpy@PLT()的调用。

我想从此源创建一个位置独立的可执行文件,并在实现ASLR的安全环境中运行此文件,并且加载程序禁止任何二进制文件 具有基于PLT / GOT的重定位。

我尝试使用-fno-tree-loop-distribute-patterns之类的选项,但是即使使用了该选项,如果存在-fPIE标志,我也会看到对memcpy@PLT的引用。

我什至尝试了-fno-plt-mstringop-strategy=loop之类的选项,但我不想使用通过这些选项生成的输出程序。

我的问题不是memcpy而是PLT部分;我希望GCC在检测到存在结构变量分配时在位置独立的可执行文件中生成对memcpy的引用(而不是对memcpy@PLT的引用)。

我也尝试过为该文件添加隐藏可见性,但是在这种情况下,也有相同的PLT参考。

#pragma GCC visibility push(hidden)

GCC在检测到存在结构变量分配时,是否总是向位置独立的可执行文件插入对memcpy@PLT的调用? 可以指示GCC插入带有memcpy标志的-fPIE吗?

2 个答案:

答案 0 :(得分:0)

memcpy是具有外部链接的功能。在与位置无关的可执行文件中,只能通过PLT或GOTPCREL(-fno-plt)进行引用。

唯一的选择是将memcpy内联到调用方中。

答案 1 :(得分:-1)

请勿在整个结构和联合中使用分配运算符,否则很有可能会调用memcpy。

顺便说一句,如果您在位置无关的代码中使用标准库的任何功能,或者需要重写所使用的功能,则需要重新编译整个标准库。