簡體   English   中英

如何更改gcc生成的asm代碼的入口點?

[英]How to change the entry point of gcc generated asm code?

這個實驗是在32位Linux上。

我想在asm級別上進行轉換,並且我試圖在調用函數main之前實現我的轉換。

目前我正在嘗試編寫一個新的入口點,實現我的轉換代碼,並希望這個新的入口點可以成功調用main

基本上gcc生成的匯編代碼的默認入口點是main,我舉一個例子如下:

c代碼:

int main()
{
    return 0;
}

我使用此命令生成asm代碼:

gcc -masm=intel -fno-asynchronous-unwind-tables -S main.c

這就是我得到的:

    .file   "main.c"
    .intel_syntax noprefix
    .text
    .globl  main
    .type   main, @function
main:
    push    ebp
    mov     ebp, esp
    mov     eax, 0
    pop     ebp
    ret
    .size   main, .-main
    .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
    .section        .note.GNU-stack,"",@progbits

誰能告訴我如何實現一個新的入口點 (可能是類似_start的函數)並在這個新的入口點結束時調用main

謝謝!

我懷疑你應該替換_start()因為它是特定於平台和libc的。 您可以在匯編程序中編寫所有代碼,因此您不需要特定於libc的初始化,或者您應該復制所有_start()活動,包括您不知道的事項。 后者看起來很虛偽。

如果您同意不替換start()但使用機制在main()之前運行某些代碼,則使用__attribute__((constructor))聲明一個函數。 這是GCC擴展的記錄,它主動用於例如C ++中的靜態對象初始化。 這樣的函數不能獲得參數或返回實際值,也不能以另一種方式覆蓋控制流。 我無法理解你對“轉型”的意思,所以它可能與你的意圖相矛盾; 如果是這樣,你會更詳細地解釋這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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