求助:如何使用ld链接这段汇编代码(solved)
本帖最后由 beyond_touch 于 2010-09-02 09:49 编辑
这边这段汇编代码,我用gcc可以编译通过。但是用as/ld分开编译/链接就会出错.
$ make
as -g -o cpuid.o cpuid.s
ld -lc -o cpuid cpuid.o /usr/lib/crt1.o /usr/lib/crti.o
/usr/lib/crt1.o: In function `_start':
(.text+0x12): undefined reference to `__libc_csu_fini'
/usr/lib/crt1.o: In function `_start':
(.text+0x19): undefined reference to `__libc_csu_init'
make: *** [cpuid] Error 1
- .data
- buffer:
- .asciz "The Processor Vendor ID is '%s'n"
- .text
- .globl main
- main:
- pushq %rbp
- movq %rsp, %rbp
- subq $32, %rsp
- movl %edi, -4(%rbp)
- movq %rdi, -16(%rbp)
- xorl %eax, %eax
- cpuid
- movl %ebx, -32(%rbp)
- movl %edx, -28(%rbp)
- movl %ecx, -24(%rbp)
- movl $0, -20(%rbp)
- leaq buffer(%rip), %rdi
- leaq -32(%rbp), %rsi
- movl $0, %eax
- call printf
- xorl %eax, %eax
- leave
- ret
复制代码
- AS=as
- LD=ld
- ASFLAGS=-g
- LDFLAGS=-lc
- WRAPPERS=crt1.o crti.o
- OBJS=cpuid.o
- vpath %.o /usr/lib
- cpuid: $(OBJS) $(WRAPPERS)
- $(LD) $(LDFLAGS) -o $@ $^
- $(OBJS): %.o: %.s
- $(AS) $(ASFLAGS) -o $@ $^
- .PHONY: clean
- clean:
- rm -f cpuid *.o
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
更多
发布评论
评论(4)
个人觉得,凡是用ld的地方,不妨换成gcc,这样就可以把额外要链接的文件交给gcc自己来处理。
而且,as可以换成gcc -S。
本帖最后由 beyond_touch 于 2010-09-02 09:49 编辑
谢谢楼上两位
真是绝了〜
注意那个"-lc", 它只要出现在现在这个位置,或者更加靠前一点的位置,链接就会出错。
再靠后边一个位置就可以通过链接。
真是TM绝了
修改之后的Makefile
复制代码
你用gcc -dumpspecs看一下,在startfile那一节,有哪些.o参与了startfile的链接的
先用如下命令,查看一下ld都额外链接了哪些库和文件。
$gcc -v -lc -o cpuid cpuid.o