C 查找mmap标志值
我想知道在OSX上哪里可以找到mmap标志值。mmap的手册页说使用MAP_PRIVATE、MAP_。。。诸如此类,但是如果您处理的是程序集,那么您必须知道进行系统调用的实际值。我试图寻找定义这些常量的头文件,但找不到它。有人可以链接它吗?使用带有gcc的C 查找mmap标志值,c,assembly,x86,x86-64,mmap,C,Assembly,X86,X86 64,Mmap,我想知道在OSX上哪里可以找到mmap标志值。mmap的手册页说使用MAP_PRIVATE、MAP_。。。诸如此类,但是如果您处理的是程序集,那么您必须知道进行系统调用的实际值。我试图寻找定义这些常量的头文件,但找不到它。有人可以链接它吗?使用带有gcc的-E选项,您可以在预处理器之后查看源文件的输出。在以下源文件上使用gcc-etest.c #include <sys/mman.h> int main() { return MAP_PRIVATE; } 这表明在
-E
选项,您可以在预处理器之后查看源文件的输出。在以下源文件上使用gcc-etest.c
#include <sys/mman.h>
int main() {
return MAP_PRIVATE;
}
这表明在我的系统上,
MAP\u PRIVATE
等于0x02
。但并非所有系统都是如此。要首先找到正确的文件,请选择两个选项:
- 用谷歌搜索宏,并查看文档,看看它说要包含哪些标题。e、 g.
手册页仅提及mmap
sys/mman.h
- 或者:了解系统将头文件保存在哪里,并在那里递归grep。(或使用)。e、 g.在我的GNU/Linux系统上,
将只搜索这两个目录下的ack--hh MAP\u PRIVATE/usr/include//usr/lib/gcc/x86\u 64-linux-gnu/5/
文件(.h
),这是所有系统头所在的目录--hh
-dM
)包括当前行号设置行,这些行号设置行告诉您包含了哪些标题。e、 g.#216”/usr/lib/gcc/x86_64-linux-gnu/5/include/stddef.h“34
使用C预处理器转储宏值。
gcc-E-dM
仅打印#在处理结束时使用所有宏的最终值定义
行,而不是预处理源-
告诉它从stdin读取,因此您可以使用echo
将代码片段导入其中
echo '#include <sys/mman.h>' | gcc -E - -dM | less
也许在构建系统中使用它,而不是硬编码搜索结果 如果您正在编写需要这些宏定义的实际asm代码,请记住,
gcc-cfoo.S
在汇编之前通过c预处理器运行.S
文件。但是,sys/mman.h
包含宏定义以外的行(如typedef unsigned char
),这些行不是有效的asm语法
实现这一点的最适合未来的/可移植的方法可能是让您的构建脚本/Makefile使用gcc-E-dM
来创建所需系统头的本地宏版本。然后您的.S
文件可以#包括“system\u macros/mman.h”
等等
但是,请注意((void*)-1)
对MAP\u的定义失败了
:该语法不会进行汇编,因此这并不总是适用于编写在具有相同ABI但不同常量和系统调用号的不同系统上工作的便携式asm
对于系统调用号,系统通常只有宏,而不是原型或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。eq
定义:
mov r10d, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB
与外部某处的链接只是等待发生的死链接,因此不鼓励这样做。这些值可能与操作系统有关,因此您确实需要找到它们。因为编译器可以在您的计算机上找到它们,所以您也可以。如果您的目标是使用汇编,那么只需反汇编一些进行这些调用的C代码,然后查看编译器生成的值,如果您可以编写汇编,您就可以读取它,是吗?@dwelch是的,你是对的。找到include目录并尝试grep-r MAP_PRIVATE*看看你看到了什么……你可以使用gcc——帮助找到gcc-print搜索目录,这可能会让你知道从哪里开始查找标题。在linux上,你不需要它,转到/usr/include grep for map private立即找到它#define map_private 0x02,然后转到具有该定义的文件,可能会找到更多。你可以
printf“%s\n”#包括'map_private | gcc-E-| tail
或其他内容。或者只需-dM
即可转储宏定义。另请参见我的回答注意,这不是一个gcc选项,-E
是每个C编译器都应该具有的标准POSIX选项。
# 4th arg (flags) goes in r10 for the syscall ABI, vs. rcx for function calls
mov $(MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB), %r10d
mov r10d, MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB