草庐IT

linux - 为什么 gcc 4.x 在调用方法时默认为 linux 上的堆栈保留 8 个字节?

作为asm的初学者,我正在查看gcc-S生成的asm代码来学习。为什么gcc4.x在调用方法时默认为堆栈保留8个字节?func18是空函数,没有返回值,没有参数,没有定义局部变量。我不明白为什么这里保留8个字节(任何论坛/网站都没有提及原因,人们似乎认为这是理所当然的)是为了%ebp只是推送吗?或返回类型?!非常感谢!.globl_func18_func18:pushl%ebpmovl%esp,%ebpsubl$8,%esp.text 最佳答案 一些指令要求某些数据类型与16字节边界对齐(特别是SSE数据类型__m128)。为了满足

c - 堆栈溢出发生前剩余堆栈的大小

在Linux上,使用C,假设我有一个动态确定的n命名我必须存储在数组中的元素数量(intmy_array[n])只是在很短的时间内,比如一个函数调用,被调用函数只使用很少的内存(大约一百字节)。大部分n很少,大约十分之一。但有时n可能很大,多达1000或1'000'000。如何计算,我的堆栈是否可以容纳n*o+p个字节而不溢出?基本上:我的堆栈中还剩下多少字节? 最佳答案 的确,checkingavailablestack问题给出了很好的答案。但更务实的答案是:不要在调用堆栈上分配大数据。在您的情况下,您可以以不同方式处理n时的情况

c - 堆栈溢出发生前剩余堆栈的大小

在Linux上,使用C,假设我有一个动态确定的n命名我必须存储在数组中的元素数量(intmy_array[n])只是在很短的时间内,比如一个函数调用,被调用函数只使用很少的内存(大约一百字节)。大部分n很少,大约十分之一。但有时n可能很大,多达1000或1'000'000。如何计算,我的堆栈是否可以容纳n*o+p个字节而不溢出?基本上:我的堆栈中还剩下多少字节? 最佳答案 的确,checkingavailablestack问题给出了很好的答案。但更务实的答案是:不要在调用堆栈上分配大数据。在您的情况下,您可以以不同方式处理n时的情况

c - 堆栈旁边的线程有什么用

在Linux进程中,每个线程都有自己的堆栈。除此之外,每个线程还有什么是本地的。我已经阅读了文件分配表等内容......有人可以向我提供特定于线程的内容列表以及它们在内存中的排列方式。其次,我注意到当我为一个线程分配一个堆栈时(见下面的代码),线程函数中第一个变量的地址在我分配的堆栈地址(stackAddr)。我认为这是因为栈顶是分配的堆栈内存的结束地址,因为局部变量地址和分配的堆栈的值的差异大约是堆栈的大小(STACKSIZE)。换句话说,它看起来像是从底部向顶部生长。pthread_attr_init(&attr[tid]);stackAddr=malloc(STACKSIZE);

c - 堆栈旁边的线程有什么用

在Linux进程中,每个线程都有自己的堆栈。除此之外,每个线程还有什么是本地的。我已经阅读了文件分配表等内容......有人可以向我提供特定于线程的内容列表以及它们在内存中的排列方式。其次,我注意到当我为一个线程分配一个堆栈时(见下面的代码),线程函数中第一个变量的地址在我分配的堆栈地址(stackAddr)。我认为这是因为栈顶是分配的堆栈内存的结束地址,因为局部变量地址和分配的堆栈的值的差异大约是堆栈的大小(STACKSIZE)。换句话说,它看起来像是从底部向顶部生长。pthread_attr_init(&attr[tid]);stackAddr=malloc(STACKSIZE);

linux - 每个进程是否存在内核堆栈?

每个用户空间进程是否存在内核堆栈和用户空间堆栈?如果两个堆栈都存在,那么每个用户空间进程应该有2个堆栈指针,对吗? 最佳答案 在Linux中,每个任务(用户空间或内核线程)都有一个8kb或4kb的内核堆栈,具体取决于内核配置。确实有单独的堆栈指针,但是,在任何给定时间,CPU中只有一个;如果用户空间代码正在运行,用于异常或中断的内核堆栈指针由任务状态段指定,如果内核代码正在运行,则用户堆栈指针保存在位于内核堆栈的上下文结构中。 关于linux-每个进程是否存在内核堆栈?,我们在Stack

linux - 每个进程是否存在内核堆栈?

每个用户空间进程是否存在内核堆栈和用户空间堆栈?如果两个堆栈都存在,那么每个用户空间进程应该有2个堆栈指针,对吗? 最佳答案 在Linux中,每个任务(用户空间或内核线程)都有一个8kb或4kb的内核堆栈,具体取决于内核配置。确实有单独的堆栈指针,但是,在任何给定时间,CPU中只有一个;如果用户空间代码正在运行,用于异常或中断的内核堆栈指针由任务状态段指定,如果内核代码正在运行,则用户堆栈指针保存在位于内核堆栈的上下文结构中。 关于linux-每个进程是否存在内核堆栈?,我们在Stack

c - 即使使用 `noexecstack`,堆栈也是可执行的

我正在努力保护我的应用程序免受缓冲区溢出攻击。除其他事项外,我正在使用不可执行的堆栈并将我的二进制文件与noexecstack标志链接(通过将-Wl,-z,noexecstack传递给gcc)。一切似乎都很好-readelf确认PT_GNU_STACK指定了正确的权限:$readelf-ltarget|grep-A1GNU_STACKGNU_STACK0x00000000000000000x00000000000000000x00000000000000000x00000000000000000x0000000000000000RW10execstack也是如此:$execstack-

c - 即使使用 `noexecstack`,堆栈也是可执行的

我正在努力保护我的应用程序免受缓冲区溢出攻击。除其他事项外,我正在使用不可执行的堆栈并将我的二进制文件与noexecstack标志链接(通过将-Wl,-z,noexecstack传递给gcc)。一切似乎都很好-readelf确认PT_GNU_STACK指定了正确的权限:$readelf-ltarget|grep-A1GNU_STACKGNU_STACK0x00000000000000000x00000000000000000x00000000000000000x00000000000000000x0000000000000000RW10execstack也是如此:$execstack-

c - 有没有办法在运行时确定可用的堆栈空间?

我知道堆栈大小是固定的。所以我们不能在堆栈上存储大对象,我们转向动态分配(例如malloc)。此外,当存在函数调用嵌套时会使用堆栈,因此我们也因此避免了递归函数。有没有办法在运行时确定到目前为止使用了多少堆栈内存以及还剩下多少?在这里,我假设使用x86架构的linux环境(gcc编译器)。 最佳答案 有一个pthreadAPI可以确定堆栈的位置:#includevoidPrintStackInfo(void){pthread_attr_tAttributes;void*StackAddress;intStackSize;//Gett