查找共享库函数内定义的局部变量的地址

时间:2014-10-21 15:37:03

标签: c linux gcc assembly

我创建了一个包含3个不同功能的共享库。 在funcA函数内部,有一个局部变量,一个大小为10的数组。 funcA调用funcB并传递arr1的基址和元素的no。

funcB调用funcC并传递arr2的基址(arr1的间接基址)和no元素。

在funcC里面我正在访问数组的所有元素。 我正在路过 参数作为参考,所以每当我访问里面的数组元素 funcC,它将间接访问ORIGINAL数组的内存地址,arr1。

如何在funcA之外找到arr1的内存地址(可能在其他线程或program2中)。我知道 一旦我将退出funcA,分配给arr1的地址无效。

我想检查是否访问arr1的内存地址 执行funcC,我该怎么做?

我无法将arr1定义为extern或static。

这是我的计划

#include<stdio.h>

funcA()
{
int *arr1=malloc(10*sizeof(int));
int n;
for(n=0;n<10;n++)
arr1[n]=n+1;
for(n=0;n<15;n++)
  {
   funcB(arr1,10);
  }
}

funcB(int *arr2,int n)
{   
funcC(arr2,n);
}

funcC(int *arr3,int n)
{
    int i=0;
    for(i=0;i<n;i++)
    *(arr3+i)*=2; // Accessing local array element of funcA
}


main()
{
funcA();
}

首先,我尝试从C生成程序集。我得到了存储在堆栈中的数组的关系,可以访问ebp(不知道如何从c程序访问特定地址,如[ebp-40] ?)。

然后我使用gdb查找funcA和arr1的地址,但是无法理解如何确认我正在获取arr1的正确地址?

我在ubuntu12.04下使用gcc。任何帮助理解或任何链接将受到高度赞赏。提前谢谢。

2 个答案:

答案 0 :(得分:1)

只有当声明它的函数在call stack上有一个活动帧时(并且在技术上,当声明本地处于活动状态的块时),本地变量才存在。

请注意,对于递归函数,您将获得多个局部变量(每个调用帧一个)。此外,如果多个线程具有用于声明该变量的相同功能的活动帧,则每个活动调用帧具有本地变量的这样的地址。最后,编译器会优化一些变量,并且可能不会对其中的某些变量使用任何堆栈槽(例如,将该变量放入寄存器中;阅读register allocation)。

所以你找不到局部变量的地址,因为那个局部变量可能不存在 - 它的函数没有活动的调用帧 - 或者存在多个 - recursion的几个活动调用帧 - 。

所以你的问题毫无意义!

当然,您可以在函数中存储一些代码,声明本地 - 局部变量的地址(例如,在全局,堆中某些记录的字段中等等)。当你从声明它的块中退出(或返回)时,该地址将变为无效。使用或取消引用此类无效地址为undefined behavior

答案 1 :(得分:-1)

打印指针的地址它将是相同的,这意味着所有指针都指向同一个内存位置。

funcA()
    {
       int arr1[10];
       int n;
       for(n=0;n<10;n++)
          arr1[n]=n+1;
       printf("%p\n",arr1);
       funcB(arr1,10);
    }

    funcB(int *arr2,int n)
    {
       printf("%p\n",arr2);

       funcC(arr2,n);
    }

    funcC(int *arr3,int n)
    {
       int i=0;
       printf("%p\n",arr3);
       for(i=0;i<n;i++)
          printf("%d \n",*(arr3+i));
    }