Linux 程序集创建文件有名称大小限制吗?
Linux Assembly Creating File Has A Name Size Limit?
我正在尝试在 32 位程序集中创建一个文件,但是在创建文件时名称被限制为只有四个字符。我不确定为什么会这样。
这是我的代码;
.section .data
.equ SYS_WRITE, 4
.equ SYS_CREAT, 8
.equ SYS_OPEN, 5
.equ SYS_CLOSE, 6
.equ O_CREAT_WRONLY_TRUNC, 03101
.equ LINUX_SYSCALL, 0x80
name:
.ascii "t.txt[=11=]"
.section .text
.global _start
_start:
movl %esp, %ebp
pushl name
movl $SYS_OPEN, %eax
movl %esp, %ebx
movl $O_CREAT_WRONLY_TRUNC, %ecx
movl 66, %edx
int $LINUX_SYSCALL
movl %eax, %esi
movl $SYS_CLOSE, %eax
movl %esi, %ebx
int $LINUX_SYSCALL
movl , %eax
int $LINUX_SYSCALL
并通过终端编译代码;
as --32 touchfile.s -o touchfile.o
ld touchfile.o -o touchfile -m elf_i386
./touchfile
the file name also has a weird binary symbol at the end.
however when the file is created the name is constrained to only four characters.
...如果你运气不好,第4个字母后甚至会有垃圾字符(例如"t.txDK@-_X="
而不是"t.txt"
)。
您的代码只能正确处理最多 3 个字符的文件名(这意味着 4 个字符,包括终止 NUL)!
问题是以下顺序:
pushl name
...
movl %esp, %ebx
使用指令pushl name
将文件名的 4 个字节精确复制到堆栈。如果你的文件名较长,则不复制其余部分。
使用 movl %esp, %ebp
告诉 Linux 文件名位于堆栈上。
问题是:为什么要让文件名入栈?
如果你不坚持文件名在栈上,你可以删除指令pushl name
,因为你不需要将文件名复制到栈上。
使用指令mov $name, %ebx
(而不是mov %esp, %ebx
)告诉Linux文件名位于地址name
.
我正在尝试在 32 位程序集中创建一个文件,但是在创建文件时名称被限制为只有四个字符。我不确定为什么会这样。 这是我的代码;
.section .data
.equ SYS_WRITE, 4
.equ SYS_CREAT, 8
.equ SYS_OPEN, 5
.equ SYS_CLOSE, 6
.equ O_CREAT_WRONLY_TRUNC, 03101
.equ LINUX_SYSCALL, 0x80
name:
.ascii "t.txt[=11=]"
.section .text
.global _start
_start:
movl %esp, %ebp
pushl name
movl $SYS_OPEN, %eax
movl %esp, %ebx
movl $O_CREAT_WRONLY_TRUNC, %ecx
movl 66, %edx
int $LINUX_SYSCALL
movl %eax, %esi
movl $SYS_CLOSE, %eax
movl %esi, %ebx
int $LINUX_SYSCALL
movl , %eax
int $LINUX_SYSCALL
并通过终端编译代码;
as --32 touchfile.s -o touchfile.o
ld touchfile.o -o touchfile -m elf_i386
./touchfile
the file name also has a weird binary symbol at the end.
however when the file is created the name is constrained to only four characters.
...如果你运气不好,第4个字母后甚至会有垃圾字符(例如"t.txDK@-_X="
而不是"t.txt"
)。
您的代码只能正确处理最多 3 个字符的文件名(这意味着 4 个字符,包括终止 NUL)!
问题是以下顺序:
pushl name
...
movl %esp, %ebx
使用指令pushl name
将文件名的 4 个字节精确复制到堆栈。如果你的文件名较长,则不复制其余部分。
使用 movl %esp, %ebp
告诉 Linux 文件名位于堆栈上。
问题是:为什么要让文件名入栈?
如果你不坚持文件名在栈上,你可以删除指令pushl name
,因为你不需要将文件名复制到栈上。
使用指令mov $name, %ebx
(而不是mov %esp, %ebx
)告诉Linux文件名位于地址name
.