Вопрос по разделяемой библиотеке и конкретным данным потока - PullRequest
2 голосов
/ 18 сентября 2011

Этот вопрос относится к gdb и valgrind в make-файле . Я нашел причину ошибки сегментации, как указано в предыдущем разделе, и теперь я не знаю, как решить эту проблему. Извините, я не смогу опубликовать код, так как он распространяется по нескольким файлам и, следовательно, имеет тенденцию быть довольно большим.

смотрит на Makefile

all: clients.so simulator backup     
    LD_PRELOAD=/home/Juggler/client/clients.so ./simulator 
backup: backup.c libclient.a  
    gcc backup.c -o backup -L /home/Juggler/client -L. -lclient -ldl 
simulator: simulator.c libclient.a
    gcc -g simulator.c -o simulator -L /home/Juggler/client -L. -lclient -ldl -pthread 

libclient.a: libclient.o client.o  
    ar rcs libclient.a libclient.o client.o
libclient.o:libclient.c
   gcc -c libclient.c -o libclient.o -pthread
clients.so: client.o client_invoke.o
   ld -shared -o clients.so client_invoke.o client.o -ldl
client_invoke.o: client_invoke.c
   gcc -Wall -fPIC -DPIC -c -g client_invoke.c
client.o: client.c
   gcc -Wall -fPIC -DPIC -c -g client.c -ldl -pthread

Симулятор запускает несколько потоков, и каждый поток сначала использует функции из libclient.a для достижения client.c, где устанавливается соединение с сервером через сокеты. Каждый поток подключен к серверу через отдельный сокет и использует pthread_keycreate и его семейство функций для сохранения специфичности потока значения сокета. Другие вызовы из каждого потока (open, read и т. Д.) Проходят через общую библиотеку client.so, которая была предварительно загружена, а затем в client.c для отправки сообщения на сервер через специальный сокет потока.

Теперь проблема заключается в том, что любое сообщение серверу из потока, который проходит по маршруту через libclient.a, использует специфичный для потока сокет, но любое сообщение, которое проходит по маршруту через client.so, в общей библиотеке встречается ошибка сегментации при send () , Я попытался распечатать дескриптор сокета, и он печатает по первому маршруту, но не по второму ... В операторе печати возникает ошибка.

Работают ли специфичные для потока данные и общая библиотека?

Спасибо

Редактировать: код внутри и вокруг segfault

int call_execute(char *argcalls[])
{
  int *saved_socket;
  saved_socket = (int*)pthread_getspecific(key_to_sockfd);
   .....
  n = send(*saved_sockfd,argcalls[i],strlen(argcalls[i]),0);//segfault here.argcalls[i] not giving segfault

  ...

}

Был бы рад уточнить. call_execute вызывается из client_invoke, когда происходит ошибка. Но когда он вызывается из libclient.c, он работает нормально.

1 Ответ

1 голос
/ 18 сентября 2011

Да, TSS и разделяемые библиотеки работают в принципе, с одной оговоркой: исходя из моего опыта с похожими проблемами в mingw-cross-compiling, я предполагаю, что ваша библиотека pthread также должна быть динамически связана, чтобы обеспечить общее место хранения для потока -специфичные данные. Я не думаю, что это нормально для GCC, но я не уверен в этом. Два предложения:

  1. Попробуйте связать с -shared-libgcc.
  2. Переместите код, который выделяет сокет, в третью библиотеку и / или храните его исключительно в client.so, распространяя только указатель на структуру.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...