/* demo valgrind program: cc -o demo demo.c */ #include #include #include #include #include #include #define STAT_BUFFER_SIZE 4096 #define STAT_SKIP 27 extern ptrdiff_t __libc_stack_end; int main(void) { int dummy; /* lifted from os_dep.c in libgc */ char stat_buf[STAT_BUFFER_SIZE]; int f = open("/proc/self/stat", O_RDONLY); if(f < 0 || read(f, stat_buf, STAT_BUFFER_SIZE) < 2 * STAT_SKIP) { perror("/proc/self/stat"); return -1; } size_t buf_offset = 0; char c = stat_buf[buf_offset++]; size_t i; for(i = 0; i < STAT_SKIP; ++i) { while(isspace(c)) c = stat_buf[buf_offset++]; while(!isspace(c)) c = stat_buf[buf_offset++]; } while(isspace(c)) c = stat_buf[buf_offset++]; ptrdiff_t result = 0; while(isdigit(c)) { result *= 10; result += c - '0'; c = stat_buf[buf_offset++]; } close(f); printf("kernel stack base: %p\nlibc stack base: %p\ndumb stack base: %p\ndifference between kernel and dumb: %zd bytes\n", (void*) result, (void*) __libc_stack_end, (void*) &dummy, (void*) (result - (ptrdiff_t) &dummy)); }