我认为可以通过获取main函数中变量的地址并向上取整到页面边界来获得我的进程堆栈的起始位置(考虑到我的堆栈是向下增长的)。
我将此与/proc/self/maps
报告的边界进行比较,它总是偏移1、2或3页(每页4096字节),从未有不同的偏移。差异随着每次运行而变化,并且以下C程序在使用的管道中(混乱而不简洁)演示了这种差异。
stacksz.c:
#include <stdlib.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
#define CAT "cat /proc/XXXXXXXXXXX/maps"
#define CATP "cat /proc/%ld/maps"
#define MASK ((sizeof(char)<<12)-1)
int main()
{
uintptr_t top = (uintptr_t)&top + MASK & ~MASK;
char cat[sizeof CAT];
sprintf(cat,CATP,(long)getpid());
if(system(cat)) return 1;
printf(" %lx stack\n", top);
return 0;
}
bash管道:
gcc stacksz.c && echo "$(( $(./a.out |grep stack |tr '-' ' ' |cut -d' ' -f2 |sed 's/^/0x/'|tr '\n' -|sed 's/-$//') ))"
我很好奇是否有人能解释这个现象。 这台机器是
Linux precision 4.15.0-43-generic #46-Ubuntu SMP x86_64
。我在1000次运行中得到了以下的偏移量分布:
4096 195
8192 490
12288 315
/proc/self/maps
。) - Kerrek SB