По причинам, я хочу, чтобы некоторые записи в секции PLT. Мне удалось сделать это для некоторых записей, однако некоторые функции никогда не вставлены в 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, я компилирую helper.o
с использованием -O0
. main.o
может быть скомпилирован с более высоким уровнем, скажем, `-O1 '.
На исполняемом объекте я ожидаю увидеть записи всех трех функций: strcmp
, abs
и dadd
. Однако, это не так.
Я что-то упустил? Возможно ли, что компоновщик пропускает некоторые вещи, потому что он выясняет, что их никогда не называют? Несмотря на использование O0 для помощника и используемый атрибут для функции forceplt?
Помогите мне сделать правильный праздник .. десять. млн. вопросов!
Cheers!