【发布时间】: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);
}
然后,我将上面的两个可重定位对象编译并链接成一个可执行对象。为了确保abs 和dadd 函数将保留在PLT 部分,我使用-O0 编译helper.o。 main.o 可以用更高级别编译,比如说`-O1'。
在可执行对象上,我希望看到所有 3 个函数的条目:strcmp、abs 和 dadd。然而,事实并非如此。
我在这里遗漏了什么吗? 链接器是否有可能因为发现它们从未被调用而忽略了一些东西?尽管使用 O0 作为助手,并且使用了 forceplt 函数的属性?
帮我好好庆祝一下……十岁。百万。问题!
干杯!
【问题讨论】:
标签: c compilation linker objdump object-files