2012-03-13 32 views
2

每個程序都有一個main()並且程序從那裏開始執行。是否有可能編寫一個沒有main()的程序,並創建另一個函數作爲入口點?如果是這樣,任何人都可以告訴我該怎麼辦?我正在使用Linux?如何使其他函數作爲除main()之外的入口點C

+7

你想通過沒有'main'作爲你的入口點來實現什麼? – eduffy 2012-03-13 01:55:42

+1

@eduffy正在閱讀一本關於C的書,它提到main()只是一個函數,因爲它有許多其他的功能,所以有這個疑問, – Manu 2012-03-14 04:48:45

+0

看看這篇文章http://linuxgazette.net/issue84/hawk.html,以看看'main()'被調用之前會發生什麼。 – eduffy 2012-03-14 13:04:23

回答

5

如果您使用gcc進行編譯,則指定-e <symbol>選項可讓您將入口點更改爲函數symbol()

+1

這可能會嚴重破壞事物,因爲它會繞過標準庫假定已經運行的啓動代碼... – 2012-03-13 02:07:50

+3

當然,但這回答了這樣一個問題:「是否可以在不使用main()的情況下編寫函數,並使其他函數如如果可以的話,任何人都可以告訴我該怎麼做,我正在使用linux「,而不是」我怎樣才能改變C程序的入口點,避免嚴重破壞「。 – 2012-03-13 02:14:17

+0

夠公平的。這更多的是對OP的評論,而不是對你的回答的評論。 – 2012-03-13 02:21:42

-1

有一種構建可執行共享庫的解決方案,您可以使用另一個函數作爲入口點構建程序。

代碼如下:

#include <stdio.h> 
#include <stdlib.h> 
const char __invoke_dynamic_linker[] __attribute__ ((section (".interp"))) 
    = "/lib/ld-linux.so.2"; 
void fun() 
{ 
    printf("This is fun./n"); 
    exit(0); 
} 

然後建立你的程序作爲一個共享庫,並指定FUNC爲切入點:

$ gcc -fpic -shared -o fun.so -Wl,-e,fun fun.c 
$ ./fun.so 

這種方式的問題在於,FUNC不能像我們在main函數中那樣擁有正常的參數,這是因爲我們沒有c庫來初始化主要參數的東西。

+0

你的建議似乎比問題更模糊。你的意思是說入口函數應該在一個動態鏈接的庫中,這樣它的地址可以用名字查找嗎? – 2012-03-13 02:31:26

+0

@GeorgeSkoptsov它不需要是一個動態鏈接的庫,只有當你不需要去除符號信息或者你可以用硬編碼來比較參數與一些已知的函數符號時,它可能在程序本身。我認爲Manu只是想讓程序調用不同的功能。 – 2012-03-13 02:51:45

相關問題