【发布时间】:2014-12-14 05:04:29
【问题描述】:
我需要获取以下进程段的开始和结束地址:代码、数据、堆栈、环境。我了解它如何位于内存中,但不知道如何使用 api 调用或其他方式获取它。我已经找到了如何使用这段代码开始一些片段
#include <stdio.h>
int temp_data = 100;
static int temp_bss;
void print_addr ( void )
{
int local_var = 100;
int *code_segment_address = ( int* ) &print_addr;
int *data_segment_address = &temp_data;
int *bss_address = &temp_bss;
int *stack_segment_address = &local_var;
printf ( "\nAddress of various segments:" );
printf ( "\n\tCode Segment : %p" , code_segment_address );
printf ( "\n\tData Segment : %p" , data_segment_address );
printf ( "\n\tBSS : %p" , bss_address );
printf ( "\n\tStack Segment : %p\n" , stack_segment_address );
}
int main ( )
{
print_addr ();
return 0;
}
但我不知道如何找到每个段的结尾。我唯一的想法是一个段的结束是另一个段的开始。 请解释我如何使用 C 和 linux API 来做到这一点。
【问题讨论】:
-
你想从内存中的一个进程中得到这个?或者来自磁盘上的 ELF 可执行文件?无论哪种方式,信息都在 ELF 标头中。你应该看看 ELF 规范。
-
你为什么要问?您的应用程序是多线程的吗?
-
我很好奇;为什么你需要得到这些东西?
-
您计算代码段开头的代码不正确。很难预测代码最终在可执行文件中的顺序,但链接器通常会在第一个函数之前插入 PLT 表,因此您永远不会仅通过获取函数的地址来获得代码段的开头。跨度>
-
这同样适用于您的其他代码。您的
print_addr()函数不会是第一个堆栈帧,temp_data之前的数据部分中还会有其他变量。请考虑参考objdump的输出,了解您的可执行文件的外观。
标签: c linux unix memory-management system