我正在尝试为汇编程序编写静态库。但它不起作用。该库构建正常,但是当我尝试构建程序时,会发生这种情况:
$ ld -o hello -L../myasm -lmyasm hello.o
hello.o: In function `_start':
(.text+0x18): undefined reference to `exit'
我p了一下,这进一步使我感到困惑。
$ nm ../myasm/libmyasm.a
myasm.o:
00000000 T exit
$ nm hello.o
00000000 T _start
U exit
00000000 d message
知道发生了什么事吗?
我的代码:
#; This is a hello world program, in assembler.
.extern exit
.data
message:
.byte 14
.ascii "Hello, World!\n"
.text
.global _start
_start:
#; First, write the message.
mov $4, %eax #; write syscall number
mov $1, %ebx #; stdout file descriptor
mov $message+1, %ecx #; message address
mov message, %dl #; we only want one byte, so %dl
int $0x80
#; Now, we need to exit.
call exit
hello: hello.o
ld -o hello -L../myasm -lmyasm hello.o
hello.o: hello.s
as -o hello.o hello.s
run: hello
./hello
clean:
rm hello.o hello
#; lib.s
.text
.global exit
exit:
mov $1, %eax #; exit syscall #
mov $0, %ebx #; success
int $0x80
libmyasm.a: myasm.o
ar cr libmyasm.a myasm.o
myasm.o: myasm.s
as -o myasm.o myasm.s
clean:
rm myasm.o libmyasm.a
答案 0 :(得分:1)
在hello
的Makefile中,将对象文件hello.o
移到-lmyasm
之前:
hello: hello.o
ld -o hello hello.o -L../myasm -lmyasm
...
请参阅-l
此处有关如何完成符号搜索的信息,3.13 Options for Linking:
-llibrary -l library
...
在您编写此选项的命令中,它会有所不同;链接器搜索并处理库中的库和目标文件 他们是指定的。因此,
foo.o -lz bar.o
搜索了库z
在文件foo.o
之后但在bar.o
之前。如果bar.o
指的是函数z
,可能无法加载这些函数。...