/proc/self/exe 可以映射吗?
can /proc/self/exe be mmap'ed?
进程可以使用 mmap 读取 /proc/self/exe 吗?该程序无法映射文件:
$ cat e.c
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int main()
{
int f=open("/proc/self/exe",O_RDONLY);
char*p=mmap(NULL,0,PROT_READ,0,f,0);
return 0;
}
$ cc e.c -o e
$ strace ./e
[snip]
open("/proc/self/exe", O_RDONLY) = 3
mmap(NULL, 0, PROT_READ, MAP_FILE, 3, 0) = -1 EINVAL (Invalid argument)
exit_group(0) = ?
+++ exited with 0 +++
你在这里犯了 2 个错误:
- 映射大小必须 > 0。Zero-size映射无效。
- 如果要创建共享 (
MAP_SHARED
) 或私有 (MAP_PRIVATE
) 映射,则必须指定。
例如以下应该有效:
char *p = mmap(NULL, 4096, PROT_READ, MAP_SHARED, f, 0);
如果您希望映射完整的可执行文件,您必须先对其执行 stat()
,以检索正确的文件大小,然后将其用作 mmap()
的第二个参数。
进程可以使用 mmap 读取 /proc/self/exe 吗?该程序无法映射文件:
$ cat e.c
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int main()
{
int f=open("/proc/self/exe",O_RDONLY);
char*p=mmap(NULL,0,PROT_READ,0,f,0);
return 0;
}
$ cc e.c -o e
$ strace ./e
[snip]
open("/proc/self/exe", O_RDONLY) = 3
mmap(NULL, 0, PROT_READ, MAP_FILE, 3, 0) = -1 EINVAL (Invalid argument)
exit_group(0) = ?
+++ exited with 0 +++
你在这里犯了 2 个错误:
- 映射大小必须 > 0。Zero-size映射无效。
- 如果要创建共享 (
MAP_SHARED
) 或私有 (MAP_PRIVATE
) 映射,则必须指定。
例如以下应该有效:
char *p = mmap(NULL, 4096, PROT_READ, MAP_SHARED, f, 0);
如果您希望映射完整的可执行文件,您必须先对其执行 stat()
,以检索正确的文件大小,然后将其用作 mmap()
的第二个参数。