2013-03-23 105 views
3

我需要在我的C程序中使用簡單的ELF文件。 我不能使用任何外部庫,但我可以使用elf.h使用ELF文件

讓我們hello.o文件來源:

int Hello() { return 3; } 

我怎麼能訪問Hello僅僅具有hello.o文件ohter C程序?

我應該加載它到內存使用mmap或者像這樣。最後,我需要處理非常複雜的ELF文件,但現在我不知道該如何開始。

更新: 我需要按照我描述的方式這樣做,因爲它是用於學習的目的。 整個問題比我描述的更復雜。

對於這個問題,假設我需要編寫方法:

int HelloFromElfO(const char* helloFile); 

這將執行在helloFile實施Hello功能。

我不想要完整答案。我不需要任何代碼。我需要一些東西來開始。

我有關於ELF文件結構的基本知識,但我不知道如何在二進制文件中使用C語言工作而沒有任何解析器或者像這樣。

UPDATE2: 好的,像readelf這樣的應用程序是很複雜。所以,也許我嘗試這種方式:讓我再說我有hello.o映射到ptr內存。我如何獲得指向Hello函數的指針?

如何從hello.o獲取任何結構化數據?我的意思是,不是純字節,而是我可以使用的東西。

+2

你沒有選擇簡單地把它們變成共享對象,並依靠動態加載器? – NPE 2013-03-23 12:01:20

+0

@npe這是學術問題。我需要這樣做。 – Ari 2013-03-23 12:33:04

+1

嘗試查看'readelf'命令及其源代碼,它應該顯示如何從.o文件中提取所需的信息。也許你也可以看一下'dlsym'源代碼,因爲它可以做你想做的事情,但是在C庫中。 – teppic 2013-03-23 13:00:33

回答

5

這比您想象的要容易得多。 ELF與你的問題無關(而且mmap()甚至更​​遠......)。 hello.o不是ELF文件,而是對象文件。

您可以將目標文件鏈接到您的可執行文件,然後您將能夠訪問Hello()。假設你編譯你的程序的目標文件作爲yourCode.o,你hello.o

cc yourCode.o hello.o -o yourExecutable 

鏈接此yourCode.ohere

編輯

如果您不想鏈接的文件,但動態加載它,然後

  1. mmap()目標文件
  2. 獲取內存Hello()地址。您可以爲此靜態分析hello.o(例如,使用objdump)並在文件中獲取Hello()入口點偏移量。
  3. 將此偏移量加到mmap()返回的地址得到Hello()地址。
  4. 地圖Hello()地址爲function pointer
  5. 調用函數。
  6. ???
  7. 利潤
+0

我知道。問題是我不想鏈接文件,我想動態加載它(並且我不想使用.so)。 這是學術問題。我需要自己實施一些「動態鏈接」。 – Ari 2013-03-23 12:32:24

+0

請明確指出你不想鏈接你的問題,否則我們不知道;) – m0skit0 2013-03-23 12:33:31

+0

我已經更新了我的答案。 – m0skit0 2013-03-23 12:46:52