Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC组装错误:针对';重新定位R#u X86_64_32S;。数据'; 处境 环境_Gcc_Assembly_Linker_Elf_Relocation - Fatal编程技术网

GCC组装错误:针对';重新定位R#u X86_64_32S;。数据'; 处境 环境

GCC组装错误:针对';重新定位R#u X86_64_32S;。数据'; 处境 环境,gcc,assembly,linker,elf,relocation,Gcc,Assembly,Linker,Elf,Relocation,Arch Linux x86-64(4.2.3-1-Arch) 海湾合作委员会 通用条款(gcc)5.2.0 命令 错误 代码 问题: 我试图使用gcc在上述code部分中使用上述command部分中的命令编译程序,结果在error部分中出错 注意我不是在编译共享库 这个错误是什么 我该如何解决这个问题 特定错误是由于push指令仅支持32位立即数,而您试图将其用于64位地址 然而,整个代码是错误的。目前还不清楚您想要的是32位还是64位代码。除了pushq之外,大多数代码似乎都是

Arch Linux x86-64(4.2.3-1-Arch)

  • 海湾合作委员会 通用条款(gcc)5.2.0

  • 命令
  • 错误
  • 代码

  • 问题:
    我试图使用
    gcc
    在上述code部分中使用上述command部分中的命令编译程序,结果在error部分中出错

    注意我不是在编译共享库

  • 这个错误是什么
  • 我该如何解决这个问题


  • 特定错误是由于
    push
    指令仅支持32位立即数,而您试图将其用于64位地址

    然而,整个代码是错误的。目前还不清楚您想要的是32位还是64位代码。除了
    pushq
    之外,大多数代码似乎都是32位的,所以我假设您确实需要32位代码。为此,将所有这些更改为
    push
    (无论如何这是个好主意),并使用
    gcc-m32
    进行编译。另外,您只需要从堆栈中删除4个字节,因此使用
    addl$4,%esp
    。(感谢@Employed Russian指出这一点。)

    64位调用约定不同于32位,因此要创建64位版本,必须进行更多更改。因为我假设您真的想要32位,所以这里仅用于说明:

    .section .data
    msg:
        .asciz "Printf In Assembly!!\n"
    
    .section .text
    .globl main
    main:
        subq $8, %rsp
        leaq msg(%rip), %rdi
        xor %al, %al
        call printf
    
        xor %edi, %edi
        call exit
    

    对于32位代码,调用
    后的堆栈清理也需要从8更改为4。即使在这里没有区别:)@Jester,我也找不到任何关于x64气体asm的书。只有32位。正如我从示例中看到的,x64和32中的“hello world”完全不同。(例如,对于fd、syscall和其他功能,没有立即推送)。那么,在哪里可以找到x64 asm的好书或资源呢?另外,我想学习x64用于内核系统调用和驱动器开发,但内核是否在其*.S文件中实际使用x64 asm或32位?32位asm与实际使用的x64有何区别?64位内核使用64位asm。驱动程序不使用asm。调用约定和其他低级内容在中定义。系统调用和参数在内核源代码或中描述。
    
    /usr/bin/ld: /tmp/cct4fa.o: Relocation R_X86_64_32S against '.data' can not be used when making a shared object; recompile with -fPIC
    /tmp/cct4fa.o:err adding symbols: Bad value
    collect2: error: ld returned 1 exit status
    
    .section .data
    msg:
        .asciz "Printf In Assembly!!\n"
    
    .section .text
    .globl main
    main:
        pushq $msg
        call printf
        addq $8 %esp
    
        pushq $0
        call exit
    
    .section .data
    msg:
        .asciz "Printf In Assembly!!\n"
    
    .section .text
    .globl main
    main:
        subq $8, %rsp
        leaq msg(%rip), %rdi
        xor %al, %al
        call printf
    
        xor %edi, %edi
        call exit