【问题标题】:Linux Assembly Creating File Has A Name Size Limit?Linux程序集创建文件有名称大小限制?
【发布时间】:2020-06-24 04:54:26
【问题描述】:

我正在尝试在 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\0"

.section .text

.global _start 
_start:                 
movl %esp, %ebp
pushl name
movl $SYS_OPEN, %eax
movl %esp, %ebx
movl $O_CREAT_WRONLY_TRUNC, %ecx
movl $0666, %edx
int $LINUX_SYSCALL


movl %eax, %esi
movl $SYS_CLOSE, %eax
movl %esi, %ebx
int $LINUX_SYSCALL

movl $1, %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.

【问题讨论】:

    标签: linux assembly x86 att


    【解决方案1】:

    但是在创建文件时,名称被限制为仅四个字符。

    ...如果运气不好,第四个字母之后甚至会出现垃圾字符(例如"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

    【讨论】:

    • @USER149372 你试过strace ./touchfile看看内部发生了什么吗?
    猜你喜欢
    • 2012-06-21
    • 2010-11-30
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    相关资源
    最近更新 更多