簡體   English   中英

在PLT部分中強制輸入

[英]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);
}

然后,我將以上兩個可重定位的對象編譯並鏈接到一個可執行對象中。 為了確保absdadd函數將保留在PLT部分中,我使用-O0編譯helper.o main.o可以進行更高級別的編譯,比方說`-O1'。

我希望在可執行對象上看到所有3個函數的條目: strcmpabsdadd 然而,這種情況並非如此。

我在這里想念什么嗎? 鏈接器是否可能因為發現它們從未被調用而忽略了某些東西? 盡管使用O0作為輔助函數,並使用了forceplt函數的屬性?

幫我適當地慶祝..十。 百萬。 問題!

干杯!

absstrcmp被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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM