如何在main函式前後執行程式碼
第一次遇到這個問題的時候,第一反應是我沒聽錯吧,然後默默在心裡把面試官罵了N遍。
對於C++來說,全域性變數、靜態變數的初始化是在main函式前執行的,這樣就可以在建構函式裡面執行一些東西。另外,今天再介紹幾個底層玩法。
直接上程式碼(以C語言為例,儲存為demo.c):
#include <stdio.h>
__attribute__((constructor)) int demo_constructor()
{
printf("Oops!\n");
return 0;
}
int demo_init()
{
__asm__ (".section .init \n call demo_init \n .section .text\n");
printf("run in .init section\n");
return 0;
}
int demo_fini()
{
__asm__(".section .fini \n call demo_fini \n .section .text\n");
printf("run in .fini section\n");
return 0;
}
__attribute__((destructor)) int demo_destructor()
{
printf("Bye!\n");
return 0;
}
int main()
{
printf("Hello World!\n");
return 0;
}
執行結果為:
結論:
- 用
__attribute__((constructor))
擴充套件關鍵字可以宣告在main函式之前執行的函式,destructor則對應main函式結束之後執行的函式。 - 用
__asm__
可以定義.init或者.fini程式碼段的函式。 - 這些函式都是在main函式之外執行的,init程式碼段先於constructor,而fini晚於destructor。
- 以上方法適用於GCC,Windows環境中應該有其他對應的方法。
相關文章
- 專案啟動,main函式之前的程式碼執行兩次 restartedMainAI函式REST
- C++如何在main函式開始之前(或結束之後)執行一段邏輯?C++AI函式
- 記錄:java程式沒有main函式只有init函式怎麼執行,或者applet小程式怎麼執行JavaAI函式APP
- linux中,C程式第一個執行的並不是main()函式LinuxC程式AI函式
- C程式起點main函式C程式AI函式
- .Net7執行模型之託管Main函式的呼叫模型AI函式
- main函式的入口函式AI函式
- Java——main函式JavaAI函式
- linux程式前臺-後臺執行Linux
- CTF逆向:將陣列作為函式程式碼執行陣列函式
- const放在函式前和放在函式後函式
- 第3節 php-src 程式執行之入口函式main定位查詢與gdb偵錯程式1PHP函式AI
- C#中Main函式後引數的處理C#AI函式
- 如何在程式碼中執行apk安裝APK
- 配置好JDK後,如何在cmd下執行java程式JDKJava
- 自執行函式函式
- 立即執行函式函式
- JVM程式用一個主執行緒來執行main()方法JVM執行緒AI
- VC程式執行時間測試函式C程式函式
- Java中建構函式、靜態程式碼塊、程式碼塊的執行順序Java函式
- js規定函式只能執行一次程式碼例項JS函式
- 如何寫好 C main 函式AI函式
- main函式你到底知道多少AI函式
- 匯入jar包,main函式JARAI函式
- 如何在終端下以後臺模式執行Linux程式模式Linux
- AS執行main()方法報錯:SourceSet with name ‘main‘ not foundAI
- 用zxing 識別二維碼的main函式AI函式
- [轉]php中使用ignore_user_abort()函式後,如何停止後臺執行的程式?PHP函式
- javascript 事件觸發以後函式指定時間後再執行JavaScript事件函式
- 「python函式:」給定一個函式,怎麼在不修改原始碼的前提下,實現函式執行前和執行後輸出Python函式原始碼
- XYHCMS 3.6 後臺程式碼執行漏洞
- 如何在互動式環境中執行Python程式Python
- 深入理解 函式、匿名函式、自執行匿名函式函式
- 如何在NotePad++中執行PHP程式碼?PHP
- AngularJs中,如何在render完成之後,執行Js指令碼AngularJS指令碼
- Python中的main函式解析PythonAI函式
- Swift中main函式去哪了?SwiftAI函式
- JS指令碼載入後執行相應回撥函式JS指令碼函式