繁体   English   中英

寻找mmap标志值

[英]Looking for mmap flag values

我想知道在哪里可以找到os x上的mmap标志值。 mmap的联机帮助页说要使用MAP_PRIVATE,MAP _...等等,但是如果要处理汇编,则必须知道实际值以进行系统调用。 我试着寻找定义这些常量的头文件,但我找不到它。 有人可能链接它吗?

在gcc中使用-E选项可以在预处理器之后查看源文件的输出。 在以下源文件中使用gcc -E test.c

#include <sys/mman.h>

int main() {
        return MAP_PRIVATE;
}

输出

...
# 2 "asdf.c" 2

int main() {

 return 0x02;
}

这表明我的系统上MAP_PRIVATE等于0x02 但是,这可能不适用于所有系统。

要在第一时间找到正确的文件:两个选项:

  • google宏,并查看文档,看看它包含哪些标题。 例如, mmap手册页仅提到sys/mman.h
  • 或者:了解系统保存头文件的位置,以及recursive-grep。 (或者使用ack ,因为它知道不搜索二进制文件,并且通常对这种事情有好处 )。 例如,在我的GNU / Linux系统上,
    ack --hh MAP_PRIVATE /usr/include/ /usr/lib/gcc/x86_64-linux-gnu/5/将只搜索这两个目录下的.h文件( --hh ),这是所有系统头文件所在的目录。

要查找系统首先保留标头的位置,cpp输出(不带-dM )包括当前行号设置行,它们会告诉您包含哪些标题。 例如
# 216 "/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h" 3 4


使用C预处理器转储宏值。

gcc -E -dM 打印#define行,其中包含处理结束时所有宏的最终值,而不是预处理源。 -告诉它从stdin读取,所以你可以使用echo将代码片段传入其中。

echo '#include <sys/mman.h>' | gcc -E - -dM | less

less ,您当然可以用/搜索。 您还可以使用&过滤 ,隐藏与正则表达式不匹配的行。 因此,您可以键入&MAP_以仅获取MAP_宏定义。


在x86-64 GNU / Linux上,我得到:

#define MAP_32BIT 0x40
#define MAP_TYPE 0x0f
#define MAP_EXECUTABLE 0x01000
#define MAP_FAILED ((void *) -1)
#define MAP_PRIVATE 0x02
...

也许在构建系统中使用它而不是硬编码搜索结果

如果您正在编写一些需要这些宏定义的实际asm代码,请记住gcc -c foo.S在汇编之前通过C预处理器运行.S文件。 但是, sys/mman.h包含除宏定义之外的行(如typedef unsigned char __u_char; ),这些行不是有效的asm语法。

最具前瞻性/可移植性的方法可能是您的构建脚本/ Makefile使用gcc -E -dM来创建您需要的系统头的本地gcc -E -dM宏版本。 然后你的.S文件可以#include "system_macros/mman.h"等等。

但是,请注意MAP_FAILED((void *) -1)定义:该语法不会汇编,因此这并不总是适用于编写可在具有相同ABI但不同常量和系统调用号的不同系统上工作的可移植asm。

对于系统调用号,系统asm/unistd.h通常只有宏,而不是原型或typedef。


您的asm源应如下所示

# 4th arg (flags) goes in r10 for the syscall ABI, vs. rcx for function calls
mov   $(MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB), %r10d

或者对于NASM,使用像sed这样的东西将cpp宏转换为NASM .equ定义:

mov   r10d,  MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM