免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3688 | 回复: 4
打印 上一主题 下一主题

求助:如何使用ld链接这段汇编代码(solved) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-01 13:00 |只看该作者 |倒序浏览
本帖最后由 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
  1.         .data
  2. buffer:
  3.         .asciz        "The Processor Vendor ID is '%s'\n\0"
  4.         .text
  5. .globl        main
  6. main:
  7.         pushq        %rbp
  8.         movq        %rsp, %rbp

  9.         subq        $32, %rsp

  10.         movl        %edi, -4(%rbp)
  11.         movq        %rdi, -16(%rbp)

  12.         xorl        %eax, %eax
  13.         cpuid

  14.         movl        %ebx, -32(%rbp)
  15.         movl        %edx, -28(%rbp)
  16.         movl        %ecx, -24(%rbp)
  17.         movl        $0, -20(%rbp)

  18.         leaq        buffer(%rip), %rdi
  19.         leaq        -32(%rbp), %rsi
  20.         movl        $0, %eax
  21.         call        printf

  22.         xorl        %eax, %eax
  23.         leave
  24.         ret
复制代码
  1. AS=as
  2. LD=ld
  3. ASFLAGS=-g
  4. LDFLAGS=-lc

  5. WRAPPERS=crt1.o crti.o
  6. OBJS=cpuid.o

  7. vpath %.o /usr/lib

  8. cpuid: $(OBJS) $(WRAPPERS)
  9.         $(LD) $(LDFLAGS) -o $@ $^

  10. $(OBJS): %.o: %.s
  11.         $(AS) $(ASFLAGS) -o $@ $^

  12. .PHONY: clean
  13. clean:
  14.         rm -f cpuid *.o
复制代码

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
2 [报告]
发表于 2010-09-01 13:52 |只看该作者
先用如下命令,查看一下ld都额外链接了哪些库和文件。

$gcc -v -lc -o cpuid cpuid.o

论坛徽章:
0
3 [报告]
发表于 2010-09-01 13:59 |只看该作者
你用gcc -dumpspecs看一下,在startfile那一节,有哪些.o参与了startfile的链接的

论坛徽章:
0
4 [报告]
发表于 2010-09-01 17:48 |只看该作者
本帖最后由 beyond_touch 于 2010-09-02 09:49 编辑

谢谢楼上两位

真是绝了〜

ld --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2  -o cpuid -lc /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/crtbegin.o cpuid.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/crtend.o /usr/lib/crtn.o

注意那个"-lc", 它只要出现在现在这个位置,或者更加靠前一点的位置,链接就会出错。
再靠后边一个位置就可以通过链接。

$ ld -v
GNU ld (GNU Binutils) 2.20.1.20100303


真是TM绝了

修改之后的Makefile
  1. AS=as
  2. LD=ld
  3. ASFLAGS=-g
  4. LDFLAGS=-m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lc
  5. WRAPPERS=crt1.o crti.o crtbegin.o crtend.o crtn.o
  6. OBJS=cpuid.o

  7. vpath %.o /usr/lib /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3

  8. cpuid: $(OBJS) $(WRAPPERS)
  9.         $(LD) -o $@ $^ $(LDFLAGS)

  10. $(OBJS): %.o: %.s
  11.         $(AS) -o $@ $^ $(ASFLAGS)

  12. .PHONY: clean
  13. clean:
  14.         rm -f cpuid *.o
复制代码

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
5 [报告]
发表于 2010-09-01 22:54 |只看该作者
个人觉得,凡是用ld的地方,不妨换成gcc,这样就可以把额外要链接的文件交给gcc自己来处理。

而且,as可以换成gcc -S。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP