我无法在汇编程序中导入符号

时间:2014-08-13 22:52:00

标签: assembly x86 static-libraries ar

我正在尝试为汇编程序编写静态库。但它不起作用。该库构建正常,但是当我尝试构建程序时,会发生这种情况:

$ 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

知道发生了什么事吗?

我的代码:

hello.s

#; 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

myasm.s

#; lib.s

.text
.global exit

exit:
    mov $1, %eax #; exit syscall #
    mov $0, %ebx #; success
    int $0x80

myasm /生成文件

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

1 个答案:

答案 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,可能无法加载这些函数。

     

...