[英]Using Assembly global variable in C
嘗試以以下方式編譯此代碼:
section .bss
global _start
global TestVar
TestVar: RESB 4
section .text
extern main
_start:
並在公元前這段代碼:
extern int TestVar;
void test2(int x, int y)
{
int z = TestVar;
x = z + y;
y = 1;
}
int main(int argc, char **argv) {
return 0;
}
與此makefile:
all: test
test: a.o b.o
ld -melf_i386 a.o b.o -o test
a.o: a.s
nasm -f elf a.s -o a.o
b.o: b.c
gcc -m32 -Wall -g b.c -o b.o
.PHONY: clean
clean:
rm -f *.o test
運行makefile會產生:
m@m-All-Series:~/testFolder$ make
nasm -f elf a.s -o a.o
gcc -m32 -Wall -g b.c -o b.o
/tmp/ccjymll2.o: In function `test2':
/home/m/testFolder/b.c:5: undefined reference to `TestVar'
collect2: error: ld returned 1 exit status
makefile:9: recipe for target 'b.o' failed
make: *** [b.o] Error 1
我究竟做錯了什么? 另外,main的存在只是因為它不是-編譯器說crt1.o的_start中有一個對main的未定義引用,main永遠不會被調用,只有test2,我不知道這是否重要,所以包括了該信息也是如此。
如果要將C源代碼編譯到目標文件中,則必須使用編譯器的-c
選項。 沒有它,gcc會嘗試繼續進行鏈接,這不是您想要的。 例如
b.o: b.c
gcc -c -m32 -Wall -g b.c
應該可以使您更進一步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.