簡體   English   中英

查找在共享庫函數中定義的局部變量的地址

[英]Finding address of local variable defined inside shared library function

我創建了一個包含3個不同功能的共享庫。 在funcA函數內部,有一個局部變量,大小為10的數組。funcA調用funcB並傳遞arr1的基地址,而沒有元素。

funcB調用funcC並傳遞arr2的基地址(間接地為arr1的基地址)和元素編號。

在funcC內部,我正在訪問array的所有元素。 當我傳遞參數作為引用時,因此每當我訪問funcC內的數組元素時,它將間接訪問原始數組arr1的內存地址。

我如何在funcA之外找到arr1的內存地址(可能在其他線程或program2中)。 我知道一旦退出funcA,分配給arr1的地址將無效。

我想檢查在執行funcC時是否訪問了arr1的內存地址,該怎么辦?

我無法將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。 任何幫助理解或任何鏈接將不勝感激。 提前致謝。

僅當在其中聲明了局部變量的函數在調用堆棧上具有活動框架時,局部變量才存在(並且從技術上講,當聲明局部變量的塊處於活動狀態時),局部變量才存在。

注意,對於遞歸函數,您將獲得幾個局部變量(每個調用框架一個)。 同樣,如果多個線程具有用於聲明該變量的同一功能的活動框架,則每個活動調用框架都具有用於局部變量的地址。 最后,編譯器將優化某些變量,並且可能不會為某些變量使用任何堆棧插槽(例如,通過將該變量放入寄存器中;了解寄存器分配信息 )。

因此,您無法找到局部變量的地址,因為該局部變量可能不存在-其功能沒有活動的調用框架-或存在乘法- 遞歸的多個活動的調用框架-。

因此,您的問題毫無道理!

當然,您可以在函數中聲明局部變量的代碼中存儲一些局部變量的地址(例如,在全局變量中,在堆中某些記錄的字段中等等)。 當您從聲明它的塊中退出(或返回)時,該地址將變為無效。 使用或取消引用這樣的無效地址是未定義的行為

打印指針的地址將是相同的,這意味着您所有的指針都指向相同的存儲位置。

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));
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM