我需要一些有关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
吗?
答案 0 :(得分:0)
memcpy
是具有外部链接的功能。在与位置无关的可执行文件中,只能通过PLT或GOTPCREL(-fno-plt
)进行引用。
唯一的选择是将memcpy
内联到调用方中。
答案 1 :(得分:-1)
请勿在整个结构和联合中使用分配运算符,否则很有可能会调用memcpy。
顺便说一句,如果您在位置无关的代码中使用标准库的任何功能,或者需要重写所使用的功能,则需要重新编译整个标准库。