[英]Force entries in PLT section
由於某些原因,我想強制在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函數的屬性?
幫我適當地慶祝..十。 百萬。 問題!
干杯!
abs
和strcmp
被GCC特別識別,似乎編譯器發現這些調用即使在-O0
也無用。 如果查看generate程序集( 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
我猜它是這樣寫的:
.text
.type forceplt2,%function
forceplt2:
bl abs@plt
或者,您可以為重定位生成原始字節(再次在x86_64上):
.data
.align 8
.type forceplt3, @object
.size forceplt3, 8
forceplt3:
.quad socket@GOTPLT
在x_86_64上 ,您應該可以使用@GOT
@GOTPLT
, @GOTOFF
@GOTPCREL
, @PLT
@GOTOFF
, @GOTPCREL
, @PLT
或@PLTOFF
。 我不太確定該如何為ARM編寫。
這些解決方案中的任何一個都會發出合適的重定位條目,這將導致鏈接編輯器發出PLT條目和PLT GOT條目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.