【问题标题】:Opening file modes in x86 assembly Linux在 x86 汇编 Linux 中打开文件模式
【发布时间】:2022-08-08 10:27:19
【问题描述】:

我正在从《从头开始编程》一书中学习 x86 汇编 Linux,目前我正在学习如何打开文件并对其进行读取或写入。我在打开文件的选项时遇到问题,我知道 0 是只读的,03101 是写和截断的,我在哪里可以获得所有打开选项的完整文档?

  • 在 C 包含文件中。在我的系统上,他们在/usr/include/x86_64-linux-gnu/bits/fcntl-linux.h
  • 我看了看,没有看到任何与文件打开选项相关的内容,我在这里遗漏了什么吗?
  • 在您的系统上可能会有所不同。我的有例如#define O_WRONLY 01# define O_TRUNC 01000
  • 也许是因为我使用 WSL 很有趣,...
  • 我已经找到它 int /usr/include/asm-generic/fcntl.h 感谢您的帮助我现在将关闭这个问题

标签: linux assembly x86


【解决方案1】:

这与 WSL 无关,与您选择在 WSL 中安装的 Linux 发行版有关。不同的发行版会将东西放在文件系统的不同位置。
locate '*fcntl*.h' 是找到合适标头的好方法。

您总是可以编译一个包含文档化头文件的 C 程序(这将拉入“真正的”头文件),并查看其 gcc -E -dM 宏定义。甚至

gcc -E -dM /usr/include/fcntl.h | | grep ' O_'

只过滤 O_ 宏常量。 (我认为fcntl.h 可能在普通的 /usr/include 中,而不是埋在某个地方,但也许这只是我的 Arch GNU/Linux 发行版保持简单。它保留了 Linux 特定的 libc 标头,如 <asm/unistd.h> 987654327@,您可以在其中找到 unistd_32.hunistd_64.h 分别对应 32 位和 64 位索书号。)或者让通常的包含路径搜索发生:

echo '#include <fcntl.h>' | gcc -E -dM - | grep ' O_'

或者编写执行printf("%x, %x\n", O_CREAT, O_TRUNC) 的代码或任何打印出您感兴趣的常量的代码,无论它们来自什么标题。 (或打印出它们的按位或,如O_CREAT|O_TRUNC)。

S_IRUSR 这样的权限模式位常量是根据__S_IREAD 这样的其他常量定义的,所以它有点像老鼠窝;可能只是打印出来是个好主意。或者简单地以八进制写入权限位,例如 mov edx, 0o666 (NASM) 或 mov $0666, %edx (GAS)。 (让 umask 在文件创建时清除 write-for-other 位)。


要查找的常量名称可以在手册页open(2) 中找到。

【讨论】:

    【解决方案2】:

    使用:Windows 子系统 我在 /usr/include/asm-generic/fcntl.h 中找到了 x86 asm linux 的正确文件

    【讨论】:

      猜你喜欢
      • 2018-05-02
      • 2017-01-13
      • 1970-01-01
      • 2022-12-11
      • 2012-05-08
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多