Как получить доступ к глобальной переменной из .so в исполняемом файле

0

Пожалуйста, помогите мне, как получить доступ к данным 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

  • 0
    Я не уверен, что понимаю проблему. Ваш main() для stub.exe никогда не вызывает fun() из libproc, поэтому нет никаких причин, по которым ваша переменная att должна вообще иметь значение. Я удивлен, что это не приводит к ошибке на самом деле.
  • 0
    Main () вызывает fun () и печатает значение 4 при запуске attol.exe.
Показать ещё 2 комментария
Теги:
gcc

1 ответ

2
Лучший ответ

Судя по коду, существует фундаментальная проблема с основной логикой.

Общий объект (*.so) загружается в адресное пространство памяти исполняемого процесса.

Однако он НЕ используется несколькими процессами. Когда два или более исполняемых файла пытаются получить доступ к одному и тому же общему объекту (*.so), они оба получают независимые копии, которые он отображает в соответствующие адресные пространства памяти.

Данные (даже глобальные) внутри общего объекта (*so) НЕ используются в двух или более исполняемых файлах.

  • 0
    Я даже не догадывался, что OP ожидал, что данные будут разделены между процессами. Не удивительно, что это не имело смысла ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню