尝试在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,我不知道是否重要,所以我包括这些信息也是如此。
答案 0 :(得分:0)
如果要将C源编译为目标文件,则必须使用编译器的-c
选项。没有它,gcc会尝试继续链接,这不是你想要的。 E.g。
b.o: b.c
gcc -c -m32 -Wall -g b.c
应该让你更进一步。