请帮帮我,如何在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.exeg ++ -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.exeg ++ -rdynamic -o stub.exe stub.o /users/hbharti/DLOPEN/proc/libproc.so -ldl
答案 0 :(得分:2)
根据代码判断,核心逻辑似乎存在根本问题。
共享对象(
*.so
)被加载到执行进程的内存地址空间。
但是,在多个进程中共享 NOT 。当2个或更多可执行文件尝试访问同一个共享对象(*.so
)时,它们都会获得映射到各自内存地址空间的独立副本。
共享对象(*so
)中的数据(甚至是全局变量)在两个或多个可执行文件中共享 NOT 。