geweitt 2020-10-17 14:08 采纳率: 0%
浏览 29

用GNU连接器ld,不会连接,求指导

学习汇编知识,在连接的时候出问题

#cpuid2.s View the CPUID Vendor ID string using C library calls
.code32
.section .data
output:
    .asciz "The processor Vendor ID is '%s'\n"
.section .bss
    .lcomm buffer,12
.section .text
.globl _start
_start:
    movl $0, %edi
    cpuid
    movl $buffer, %edi
    movl %ebx, (%edi)
    movl %edx, 4(%edi)
    movl %ecx, 8(%edi)
    pushl $buffer
    pushl $output
    call printf
    addl $8, %esp
    pushl $0
    call exit

gcc version 9.3.0,Ubuntu20.0版64位
动态加载器是ld-linux-x86-64.so.2

按照书上的描述图片说明

实际操作

gewei@ubuntu:~/C语言$ as -o cpuid2.o cpuid2.s

gewei@ubuntu:~/C语言$ ld -dynamic-linker /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 -o cpuid2 -L/usr/lib/x86_64-linux-gnu -lc cpuid2.o

gewei@ubuntu:~/C语言$ ./cpuid2

段错误 (核心已转储)

此处也用ulimit -s 设置stack size

求大神帮忙分析下,该怎么用GNU连接器才能连接出结果。

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 03:12
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在使用 GNU Linker (ld) 连接器时遇到的问题可能是由于链接器的配置或环境设置不正确。这里提供一些可能的原因和解决方法:

    原因分析

    1. 参数错误:确保 ld 被正确地安装到系统路径中,并且其动态链接库(例如 libc)已经正确链接。
    2. 环境变量:检查 LD_LIBRARY_PATH 是否包含正确的动态链接库路径。
    3. 文件权限:确认动态链接库 (libx86_64-linux-gnu.so.2) 的可执行权限已被授予。
    4. 符号引用:如果符号引用了不正确的文件或库,可能会导致链接错误。
    5. 错误信息:查看错误消息以了解具体原因,比如 Segmentation fault 或者 undefined symbol 可能意味着某些符号未被定义或者没有找到对应的库。

    解决方案

    检查并更新 ld 配置

    尝试更新 ld 链接器的配置文件(通常为 /etc/ld.so.conf.d)。如果你使用的是默认的配置,你可能需要添加新的动态链接库路径。例如,你可以添加以下行:

    /etc/ld.so.conf.d/your_library_path.conf
    

    然后运行以下命令来应用更改:

    ldconfig
    

    这将自动查找并加载这些新添加的动态链接库。

    更新动态链接库

    如果上述步骤无法解决问题,那么你的动态链接库可能需要重新建立。可以使用以下命令进行此操作:

    sudo apt-get update
    sudo apt-get install libx86_64-linux-gnu-dev
    

    安装必要的依赖项后,再次尝试使用 ld 链接器。

    检查环境变量

    确保 LD_LIBRARY_PATH 包含了正确的动态链接库路径。如果没有,请添加:

    export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:/usr/local/lib
    

    然后重启终端或使用 source ~/.bashrc 来使更改生效。

    检查符号引用

    确保所有使用的符号都指向了正确的动态链接库。这可以通过检查源代码中的函数调用来实现。对于 cpuid2.s 示例,你需要检查是否有正确的符号引用。

    确保权限

    确认动态链接库的可执行权限已经被赋予。如果不是,请通过 chmod +x 来增加权限。

    分析错误信息

    仔细阅读 ld 的输出错误消息,它们提供了关于错误发生的具体位置和原因的信息。如果是在程序代码中遇到了错误,确保所有的符号引用都是正确的,并且程序的输入/输出正确。

    希望以上建议对你有所帮助!

    评论

报告相同问题?