彙編呼叫 C 語言問題

2021-09-11 16:41:01 字數 1036 閱讀 8853

ld: 當搜尋用於 //usr/lib/x86_64-linux-gnu/libc.so 時跳過不相容的 -lc

ld: 當搜尋用於 //usr/lib/x86_64-linux-gnu/libc.a 時跳過不相容的 -lc

ld: 找不到 -lc

使用的鏈結命令為:

ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o output_file -lc input_file.o

當時以為錯誤出在系統沒有正確的生成 32 位**加了-m elf_i386選項,結果發現命令中指定載入的是 32 位動態庫,系統預設鏈結的是 64 位目標**,產生不相容錯誤.正確的鏈結方式應該是:

ld --dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc -o output_file input_file.o

ps: 在彙編中呼叫 c 函式需要採用靜態鏈結或動態鏈結的方法. 靜態鏈結會把函式目標**直接連線到應用程式的可執行檔案中. 動態鏈結使用庫方式,使得可以在應用程式中引用函式,執行時由作業系統呼叫動態鏈結庫. 呼叫鏈結庫的選項為-l選項-lc指呼叫libc.*

編譯成功後執行,報錯段錯誤(核心已轉儲)使用 gdb 除錯發現錯誤出現在函式呼叫時,查閱一番後發現:原**是採用堆疊方式傳參這種方式是在 32 位環境下使用的方法,64 位環境採用暫存器傳參方式規則為:

當引數少於 7 個時, 引數從左到右對應暫存器: rdi, rsi, rdx, rcx, r8, r9.

當引數為 7 個以上時,多出引數依次壓入堆疊.

rax 放置函式返回值

呼叫者負責平衡棧

一些**因為採用堆疊傳參

函式呼叫後會對 esp 執行 addl 指令恢復堆疊指標

在改動相關**時要留意刪除該指令

C語言彙編 函式呼叫棧

函式呼叫大家都不陌生,呼叫者向被呼叫者傳遞一些引數,然後執行被呼叫者的 最後被呼叫者向呼叫者返回結果,還有大家比較熟悉的一句話,就是函式呼叫是在棧上發生的,那麼在計算機內部到底是如何實現的呢?對於程式,編譯器會對其分配一段記憶體,在邏輯上可以分為 段,資料段,堆,棧 段 儲存程式文字,指令指標eip...

組合語言中引數呼叫問題

在模組化程式設計的過程中,用子函式的方式是很常見的一種方式,組合語言中必然會存在這樣的方式 在模組化程式設計中必不可少的的當然是傳入的引數和返回的引數 在這裡先總結一下 1 是單引數的傳遞和但引數的返回 這種傳遞方式的基本原則就是用暫存器來傳遞引數,基本格式 主函式將引數送入引數暫存器,子函式從引數...

ARM彙編 C語言 C 相互呼叫

1.匯程式設計序訪問c語言全域性變數 全域性變數只能通過位址間接呼叫,為了訪問c語言中全域性變數,首先要通過extern偽指令引入全域性變數,然後將其位址裝入暫存器中。對於unsigned char型別,使用ldrb strb訪問 對於unsigned short型別,使用ldrh strh訪問 對...