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

Posted

技术标签:

【中文标题】如何使自定义部分可执行(.text 除外)【英文标题】:How to make a custom section executable (other than .text) 【发布时间】:2021-06-29 19:37:39 【问题描述】:

以前在 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 将部分设置为可执行文件可能就足够(或必要?),例如section .my_section exec (nasm.us/doc/nasmdoc8.html#section-8.9.2)。我会认为在链接描述文件中设置权限会覆盖它,假设这是正确的链接描述文件语法,但是 IDK。 【参考方案1】:

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

    ldMEMORY 定义中设置的标志与将部分设置为可执行无关。 NASM ELF Section extensions 很重要,即即使 MEMORY 没有 x 标志,section .my_section exec 也可以工作(感谢 @peter-cordes)。 如果您正在使用特定的ld MEMORY 定义,则原点不能是0,但必须至少是0x10000(有关详细信息,请参阅此S.O q&a)使用. = 0x10000; at该部分的开头不够。

【讨论】:

以上是关于如何使自定义部分可执行(.text 除外)的主要内容,如果未能解决你的问题,请参考以下文章

如何使自定义对象可迭代?

如何使自定义 UIView 可访问?

如何使用 configureWebpack 使自定义变量可用于组件?

如何在 swift 中使自定义 UITableViewCell 中的链接可点击

如何在 ME51n tcode 中的项目级别上使自定义字段可编辑?

使自定义容器可迭代