Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 查找mmap标志值_C_Assembly_X86_X86 64_Mmap - Fatal编程技术网

C 查找mmap标志值

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; } 这表明在

我想知道在OSX上哪里可以找到mmap标志值。mmap的手册页说使用MAP_PRIVATE、MAP_。。。诸如此类,但是如果您处理的是程序集,那么您必须知道进行系统调用的实际值。我试图寻找定义这些常量的头文件,但找不到它。有人可以链接它吗?

使用带有gcc的
-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
    ),这是所有系统头所在的目录
为了找到系统首先保存标题的位置,cpp输出(不带
-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