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

发布于 2022-09-05 04:04:31 字数 2727 浏览 5 评论 4

本帖最后由 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"
  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

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

℡Ms空城旧梦 2022-09-19 10:27:20

个人觉得,凡是用ld的地方,不妨换成gcc,这样就可以把额外要链接的文件交给gcc自己来处理。

而且,as可以换成gcc -S。

森林迷了鹿 2022-09-19 00:58:19

本帖最后由 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

复制代码

み零 2022-09-14 13:19:21

你用gcc -dumpspecs看一下,在startfile那一节,有哪些.o参与了startfile的链接的

半城柳色半声笛 2022-09-07 21:51:32

先用如下命令,查看一下ld都额外链接了哪些库和文件。

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文