原始碼位址
/* mainprog.c - an example of calling an assembly function
這裡用的是 professional assembly language 原始碼
我的環境 gcc version 7.2.0 (ubuntu 7.2.0-8ubuntu3)
我改了原始碼 把所有32位暫存器全改這64位。 同時 指令後輟改為q
1。原始碼的第乙個坑 在c 檔案裡要加extern int asmfunc();
2。第二個坑 直接 gcc -o a.out ***x.s ******.c
報:allenboy@allenboy:~/桌面$ gcc -static -o allen mainprog.c asmfunc.s
allenboy@allenboy:~/桌面$ gcc -o allen mainprog.c asmfunc.s
/usr/bin/ld: /tmp/cc1qssmy.o: relocation r_x86_64_32s against `.data' can not be used when ****** a shared object; recompile with -fpic
加上gcc -fpic -o allen mainprog.c asmfunc.s
報:一樣的錯誤
allenboy@allenboy:~/桌面$ gcc -fpic -o allen mainprog.c asmfunc.s
/usr/bin/ld: /tmp/cc5b1l8q.o: relocation r_x86_64_32s against `.data' can not be used when ****** a shared object; recompile with -fpic
/usr/bin/ld: 最後的鏈結失敗: 輸出不可表示的節
collect2: error: ld returned 1 exit status
這個坑一直沒解決 (對gcc不太了解)
這裡解決辦法是他報不能生成動態庫 ,我強制生成靜態的編譯通過
allenboy@allenboy:~/桌面$ gcc -static -o allen mainprog.c asmfunc.s
allenboy@allenboy:~/桌面$ ls
code main3.cpp main8.c 美河製作.組合語言程式設計(jb51.net).pdf
ida main4.c main9.c
allenboy@allenboy:~/桌面$ ./allen
this is a test.
this is a test message from the asm function
now for the second time.
this is a test message from the asm function
this completes the test.
*/#include extern int asmfunc();
int main()
# asmfunc.s - an example of a ****** assembly language function
#.file "asmfunc.c"
.section .data
testdata:
.ascii "this is a test message from the asm function\n"
datasize:
.int 45
.section .text
.type asmfunc, @function
.globl asmfunc
asmfunc:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
movq $4, %rax
movq $1, %rbx
movq $testdata, %rcx
movq datasize, %rdx
int $0x80
popq %rbx
movq %rbp, %rsp
popq %rbp
ret
c呼叫彙編函式 1
guang guang laptop temp h ls hello hello.o hello.s main.c main.o hello.s.global hello hello movl 4,eax movl 1,ebx movl hello,ecx movl 30,edx int 0x80 ...
C語言彙編 函式呼叫棧
函式呼叫大家都不陌生,呼叫者向被呼叫者傳遞一些引數,然後執行被呼叫者的 最後被呼叫者向呼叫者返回結果,還有大家比較熟悉的一句話,就是函式呼叫是在棧上發生的,那麼在計算機內部到底是如何實現的呢?對於程式,編譯器會對其分配一段記憶體,在邏輯上可以分為 段,資料段,堆,棧 段 儲存程式文字,指令指標eip...
彙編呼叫 C 語言問題
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 linke...