簡體   English   中英

在C中使用Assembly全局變量

[英]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.

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