如何使自定义部分可执行(.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 上):
ld
MEMORY
定义中设置的标志与将部分设置为可执行无关。 NASM ELF Section extensions 很重要,即即使 MEMORY
没有 x
标志,section .my_section exec
也可以工作(感谢 @peter-cordes)。
如果您正在使用特定的ld
MEMORY
定义,则原点不能是0
,但必须至少是0x10000
(有关详细信息,请参阅此S.O q&a)使用. = 0x10000;
at该部分的开头不够。
【讨论】:
以上是关于如何使自定义部分可执行(.text 除外)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 configureWebpack 使自定义变量可用于组件?
如何在 swift 中使自定义 UITableViewCell 中的链接可点击