gpt4 book ai didi

linux - 如何使用 nasm 编译带有 .bss 部分的共享文件

转载 作者:行者123 更新时间:2023-12-04 18:57:07 25 4
gpt4 key购买 nike

我正在尝试从 nasm 编译共享文件,我正在使用以下命令:

nasm -f elf64 -o asm/asm.o asm/asm.asm
ld -shared -o asm/asm.so asm/asm.o -I/lib64/ld-linux-x86-64.so.2

在第二个之后我得到一个错误:
ld: asm/asm.o: relocation R_X86_64_32S against `.bss' can not be used when making a shared object; recompile with -fPIC
ld: final link failed: Nonrepresentable section on output

我不能使用 nasm -fPIC 代替 -f elf64 因为它是无效命令。如果我需要 .bss 部分,我应该怎么做,也许我可以用不同的方式编译它?

这是我的汇编代码:
DEFAULT                 rel    
%include "asm/python.inc"
GLOBAL PyInit_asm:function

SECTION .rodata
l_dubois_name db "dubois", 0
l_module_name db "asm", 0

SECTION .bss
digitSpace resb 100
digitSpacePos resb 8


SECTION .data
l_asm_methods:
ISTRUC PyMethodDef
at PyMethodDef.ml_name , dq l_dubois_name
at PyMethodDef.ml_meth , dq asm_dubois
at PyMethodDef.ml_flags , dq METH_NOARGS
at PyMethodDef.ml_doc , dq l_sayit_doc
IEND
NullMethodDef

l_asm_module: ;; struct PyModuleDef *
ISTRUC PyModuleDef
at PyModuleDef.m_base , PyModuleDef_HEAD_INIT
at PyModuleDef.m_name , dq l_module_name
at PyModuleDef.m_doc , dq NULL
at PyModuleDef.m_size , dq -1
at PyModuleDef.m_methods , dq l_asm_methods
at PyModuleDef.m_slots , dq NULL
at PyModuleDef.m_traverse , dq NULL
at PyModuleDef.m_clear , dq 0
at PyModuleDef.m_free , dq NULL
IEND

SECTION .text
asm_dubois:
push rbp
mov rbp, rsp
mov rax, [rbp+62]
mov rsp, rbp
pop rbp
call _printRAX
mov rax, 60
mov rdi, 0
syscall
ret

_printRAX:
mov rcx, digitSpace
mov rbx, 10
mov [rcx], rbx
inc rcx
mov [digitSpacePos], rcx

_printRAXLoop:
mov rdx, 0
mov rbx, 10
div rbx
push rax
add rdx, 48
mov rcx, [digitSpacePos]
mov [rcx], dl
inc rcx
mov [digitSpacePos], rcx
pop rax
cmp rax, 0
jne _printRAXLoop

_printRAXLoop2:
mov rcx, [digitSpacePos]
mov rax, 1
mov rdi, 1
mov rsi, rcx
mov rdx, 1
syscall
mov rcx, [digitSpacePos]
dec rcx
mov [digitSpacePos], rcx
cmp rcx, digitSpace
jge _printRAXLoop2
ret

stackOverflow 接受我的代码的一些随机文本

最佳答案

recompile with -fPIC错误消息假设 asm/object 文件是由编译器创建的。 使用手写 asm,您就是编译器,必须编写与位置无关的代码 . (或者至少是低效使用 64 位绝对地址的代码,例如 mov rcx, digitSpace ;GNU/Linux 上的这些重定位支持运行时修复。)

使用lea r8, [digitSpace] (或任何方便的reg,最好在循环之外)并与之进行比较。

cmp rcx, digitSpace使用静态地址作为 32 位立即符号扩展为 64 位。 这将需要一个 R_X86_64_32S重定位:编码为 32 位有符号值的 64 位地址。 (与 [digitSpace + rdx] 相同,例如,这是 PIC/PIE 代码中不能做的另一件事)

仅限 mov允许 64 位立即数(当您编写 mov r64, symbol 时,NASM 默认使用它)。当然,最好使用像 lea rcx, [digitSpace] 这样的 RIP 相关 LEA。 .你用过default rel所以这将是 RIP 相关的)。

Assembler Error: Mach-O 64 bit does not support absolute 32 bit addresses 的几乎完全相同的副本 (MacOS 不允许将符号地址用作 32 位立即数,因此这是一个汇编时错误,而在 Linux 上,只有当您尝试链接到 ELF 共享对象而不是非 PIE 可执行文件时才会出现错误。)

还有相关的:

  • How to load address of function or label into register in GNU Assembler - 如果您不能使用 mov r32, imm32,则最好使用 RIP 相关的 LEA
  • Mach-O 64-bit format does not support 32-bit absolute addresses. NASM Accessing Array在不允许使用 disp32 和 imm32 时使用符号地址的各种一般内容。
  • 32-bit absolute addresses no longer allowed in x86-64 Linux? - Linux PIE 可执行文件具有与共享对象相同的限制。
  • 关于linux - 如何使用 nasm 编译带有 .bss 部分的共享文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59470897/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com