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

标签 c linux gcc assembly

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

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

在 funcC 内部,我正在访问 array 的所有元素。 当我经过时 参数作为引用,所以每当我访问里面的数组元素时 funcC ,它将间接访问原始数组 arr1 的内存地址。

如何在 funcA 之外找到 arr1 的内存地址(可能在其他线程或程序2中)。我知道 一旦我退出 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。任何帮助理解或任何链接将不胜感激。提前致谢。

最佳答案

仅当声明局部变量的函数在 call stack 上具有事件帧时,局部变量才存在。 (从技术上讲,当 block 声明本地处于事件状态时)。

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

因此,您无法找到局部变量的地址,因为该局部变量可能不存在 - 其函数没有事件调用框架 - 或者存在多个 - recursion 的多个事件调用框架-.

所以你的问题毫无意义!

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

关于c - 查找共享库函数中定义的局部变量的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26490656/

相关文章:

c - 传递函数初学者

c - 使用 GSL 计算矩阵的克罗内克积的有效方法

linux - 冒泡排序时间C程序

c - ARM 程序集 - 为什么我的应用程序在将 r7 归零时崩溃?

c++ - system() 命令不起作用 C++ linux

c - GCC 部门截断(舍入问题)

c - 一旦文件描述符中没有其他内容可读取,就停止 read(2)

c - swift 3 : Compilation error converting String Array to C Char Array

c - 在以下 NASM 任务中需要帮助

c++ - 在 Linux 中运行 C++