2013-07-26 3 views
0

У меня есть файл с именем Point.c, который имеет структуру, определенную названы:Динамическая загрузка размер структуры в C

Point 

Кроме того, он имеет функции в нем названы point_str, point_deserialize.

Теперь есть подобные файлы, как это нравится

LinkedList.c, Node.c etc with similar definitions. 

Теперь я называю эти функции динамически в другом файле с помощью dlopen.

Так что, если я считаю, что тип точки, я создам строку:

point_str 

и вызвать функцию, давая путь к файлу .so с помощью dlopen.

Но, я не могу знать размер структуры динамически. Есть ли способ сделать это? Я хочу сделать что-то вроде

int size = givemesize("Point", "path_to_so"); 

Это похоже на dlopen, но для того, чтобы знать размер структуры.

Редактировать: почему я хочу знать размер?

С такими размерами я десериализую что-нибудь от строки до ее фактического типа. Вот почему мне нужен размер. Таким образом, из командной строки происходит десериализация объекта Point. Итак, с этой строкой я хочу знать фактический размер объекта Point, который находится в Point.c, и имеет libpoint.so

+0

Не является ли структурой, определенной в файле заголовка? –

+2

Если нет заголовка, который определяет структуру, то интерфейс в библиотеке должен предоставить функцию (или, возможно, погибшую от мысли, глобальную переменную), к которой вы можете получить доступ через 'dlsym()' для получения значения. Или, что более вероятно, он предоставляет некоторые API-интерфейсы для распределения пространства для вашей структуры. Без поддержки библиотеки (в виде заголовка или информации о времени выполнения) вам нужно будет написать код, слабо эквивалентный отладчику, чтобы получить информацию - если библиотека скомпилирована с имеющимися отладочными символами/информацией. –

+0

Спасибо за ответ, нет в одном файле. Если я определяю его в файле заголовка, предположим, что Point.h, как это решить проблему? – Rishi

ответ

1

Нет, вы не можете.

.so не знает размер структуры, если вы не закодируете ее в функции, доступной из .so (как сказал Джонатан в комментариях). Вся эта информация отбрасывается во время компиляции. Любые соответствующие смещения указателя/памяти вычисляются во время компиляции, и информация, используемая для вычисления этих смещений, выбрасывается.

+0

Спасибо. Я сделал это, добавив функцию в Point.o. – Rishi

Смежные вопросы