Пожалуйста, помогите мне, как получить доступ к данным varibale времени выполнения (att) в stub.exe переменной att, которая определена в proc.so,
Я создал 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" или обновленное значение.
out put attol.exe:
./attol.exe
Значение att: 4
Введите значение att:
out put stub.exe:
./stub.exe
В: 0
----Complete Код Details----
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
Судя по коду, существует фундаментальная проблема с основной логикой.
Общий объект (
*.so
) загружается в адресное пространство памяти исполняемого процесса.
Однако он НЕ используется несколькими процессами. Когда два или более исполняемых файла пытаются получить доступ к одному и тому же общему объекту (*.so
), они оба получают независимые копии, которые он отображает в соответствующие адресные пространства памяти.
Данные (даже глобальные) внутри общего объекта (*so
) НЕ используются в двух или более исполняемых файлах.
main()
дляstub.exe
никогда не вызываетfun()
из libproc, поэтому нет никаких причин, по которым ваша переменнаяatt
должна вообще иметь значение. Я удивлен, что это не приводит к ошибке на самом деле.