在C中使用Assembly全局变量

时间:2015-06-07 11:22:12

标签: c assembly makefile global-variables

尝试在a.s:

中编译此代码
section .bss
global _start
global TestVar
TestVar:    RESB 4

section .text
extern main

_start:

和b.c中的代码:

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

我做错了什么? 还有,主要就是因为如果不是 - 编译器说在crt1.o中的_start中有一个未定义的main引用,main将永远不会被调用,只有test2,我不知道是否重要,所以我包括这些信息也是如此。

1 个答案:

答案 0 :(得分:0)

如果要将C源编译为目标文件,则必须使用编译器的-c选项。没有它,gcc会尝试继续链接,这不是你想要的。 E.g。

b.o: b.c
       gcc -c -m32 -Wall -g b.c

应该让你更进一步。