如何在可执行文件中从.so访问全局变量

时间:2014-02-01 21:47:05

标签: c++ gcc

请帮帮我,如何在proc.so中定义的att变量的stub.exe中访问运行时varibale的数据(att),
我创建了proc.so并与attol.exe和stub.exe链接 attol.exe更新'att'变量,stub.exe正在访问'att'变量并打印att的值。

我使用以下命令编译代码:

  

g ++ -Wall -c attol.cc proc.cc stub.cc
  g ++ -shared -dynamiclib -fPIC -o libproc.so proc.o -ldl
  g ++ -rdynamic -o attol.exe attol.o /users/hbharti/DLOPEN/proc/libproc.so -ldl
  g ++ -rdynamic -o stub.exe stub.o /users/hbharti/DLOPEN/proc/libproc.so -ldl

当我在不同终端运行两个.exe时,attol.exe显示'att:4'值但stub.exe显示的值不正确,
但是stub.exe应该显示“4”值或更新值。

输出attol.exe:

  

./ attol.exe

att的价值是:4
输入att:

的值

输出stub.exe:

  

./ stub.exe

Att:0

----完整的代码详情----

proc.h:

  #ifndef __X_H_INCLUDED__  
  #define __X_H_INCLUDED__

  extern int att;
  int fun();
  #endif 

proc.cc:

  #include<iostream.h>
  #include "proc.h"
  int att;
  int fun ()
  {
  att=4;
  return 0;
  }

上面的代码生成proc.o然后这个proc.o将转换为proc.so,并带有以下命令:

  

g ++ -Wall -c attol.cc proc.cc stub.cc
  g ++ -shared -dynamiclib -fPIC -o libproc.so proc.o -ldl

attol.cc:

#include <iostream.h>
#include "proc.h"
using namespace std;
int main ()
{
int ch=1;
fun();
cout<<"\n Value of att is : "<<att; 
   do{
   cout<<"\n Enter the value of att : ";
   cin>>att;
   cout<<"\n Do you want to continue the : ";
   cin>>ch;
   }while(ch!=0);
return 0;
}

attol.cc文件使用以下命令

创建attol.exe
  

g ++ -rdynamic -o attol.exe attol.o /users/hbharti/DLOPEN/proc/libproc.so -ldl

输出:

  

att的价值是:4
  输入att:

的值

stub.cc:

  #include <iostream.h>
  #include <dlfcn.h>

  int main ()
  {
    void *handle;
    char *error;

    handle = dlopen ("/users/hbharti/DLOPEN/proc/libproc.so", RTLD_LAZY);
    if (!handle) {
        fputs (dlerror(), stderr);
        exit(1);
    }

   int  *att =(int*) dlsym(handle, "att");
    if ((error = dlerror()) != NULL)  {
        fputs(error, stderr);
        exit(1);
    }
    cout<<"\n Att : " <<*att;
    cout<<"\n " ;
    dlclose(handle);
   }

stub.cc文件使用以下命令

创建stub.exe
  

g ++ -rdynamic -o stub.exe stub.o /users/hbharti/DLOPEN/proc/libproc.so -ldl

1 个答案:

答案 0 :(得分:2)

根据代码判断,核心逻辑似乎存在根本问题。

  

共享对象(*.so)被加载到执行进程的内存地址空间。

但是,在多个进程中共享 NOT 。当2个或更多可执行文件尝试访问同一个共享对象(*.so)时,它们都会获得映射到各自内存地址空间的独立副本。

共享对象(*so)中的数据(甚至是全局变量)在两个或多个可执行文件中共享 NOT