gpt4 book ai didi

linux - 如何使自定义部分可执行(.text 除外)

转载 作者:行者123 更新时间:2023-12-04 13:28:02 24 4
gpt4 key购买 nike

之前在 x86_64 Linux 上多次看到的基本 Hello World:

global my_start_symbol 

section .my_section

my_start_symbol:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall

mov rax, 60
xor rdi, rdi
syscall

section .rodata:
msg: db "Hello, world!", 10
msg_len: equ $ - msg
我的当前 ld链接脚本:
__linux_mmap_min_addr = 0x10000;

ENTRY(my_start_symbol)

MEMORY
{
rom (rx) : ORIGIN = 0, LENGTH = 512K
}

SECTIONS
{
. = __linux_mmap_min_addr;
.my_section :
{
*(.my_section*)
} > rom
.rodata :
{
*(.rodata*)
} > rom
}
调用:
nasm -f elf64 assembly.asm -o assembly.o
ld -T linker.ld assembly.o -o assembly
我目前遇到了段错误。检查 readelf -a 的输出我可以看到 my_section没有可执行权限。我相信这是导致段错误的原因。如果我用 .text : { *(.my_section*) } > rom 替换它它仍然没有被设置为可执行文件。仅当我恢复使用 .text到处都是惯例,是否将其设置为可执行文件。

最佳答案

我的评估(至少在带有 NASM 的 x86_64 Linux 上):

  • ld 中设置的标志MEMORY定义与将部分设置为可执行无关。 NASM ELF Section extensions有什么关系,即 section .my_section exec即使 MEMORY 也能工作没有x标志(感谢@peter-cordes)。
  • 如果您有具体的ld MEMORY您正在使用的定义,来源不能是 0 ,但必须至少是 0x10000 (有关更多信息,请参阅此 S.O q&a)使用 . = 0x10000;在该部分的开头是不够的。
  • 关于linux - 如何使自定义部分可执行(.text 除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66927657/

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