Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> из .dll/.so файла получить информацию об экспорте 
V
    Опции темы
boostcoder
Дата 9.9.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



всем доброго вечера.

для моего меганавороченного менеджера плагинов, хочу добавить возможность получения информации об экспортируемых функциях.
1. имена экспортируемых функций.
2. возвращаемый тип.
3. кол-во и типы аргументов.

подскажите куда копать.

OS: win32/*nix


спасибо.


зы
просьба к модераторам. не могли бы вы создать зеркало в разделе "C/C++: Системное программирование и WinAPI" ;)
спасибо.

PM WWW   Вверх
MAKCim
Дата 9.9.2011, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



вообще никак (если только самим не формировать нужную информацию)
хотя можно посмотреть в сторону dwarf2


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
boostcoder
Дата 9.9.2011, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(MAKCim @  9.9.2011,  22:35 Найти цитируемый пост)
вообще никак

ы!
вообще-вообще? никак?
PM WWW   Вверх
volatile
Дата 9.9.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(boostcoder @  9.9.2011,  21:44 Найти цитируемый пост)
1. имена экспортируемых функций.

с именами все просто. (я про венду)
нужно копать таблицу экспорта, в PE формате. 
PE-формат это формат исполнимых файлов, (Portable Executible)

Цитата(boostcoder @  9.9.2011,  21:44 Найти цитируемый пост)
2. возвращаемый тип.
3. кол-во и типы аргументов.

а вот с этим посложней будет. В общем случае не возможно.
Но если экспортируемые функции С++ замангленные, то можно частично еще кое-какую инфу извлечь.
Если же не замангленные, то дохлый номер, только имена.

PM MAIL   Вверх
boostcoder
Дата 9.9.2011, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(volatile @  9.9.2011,  23:28 Найти цитируемый пост)
если экспортируемые функции С++

нет. экспортируемые функции - Си. а то, что они выполняют внутри, может быть и с++.

вообще, не думал что с этим такая проблема...

Добавлено @ 23:36
Цитата(boostcoder @  9.9.2011,  23:35 Найти цитируемый пост)
экспортируемые функции - Си

т.е. что-то типа такого:
void* create_object(name) {}
void* create_object1(name, arg1) {}
void* create_object2(name, arg1, arg2) {}
...
void delete_object(void*) {}

Добавлено @ 23:38
таки что, придется самому генерить инфу об предоставляемых объектах... smile 

Это сообщение отредактировал(а) boostcoder - 9.9.2011, 23:38
PM WWW   Вверх
volatile
Дата 9.9.2011, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(boostcoder @  9.9.2011,  23:35 Найти цитируемый пост)
нет. экспортируемые функции - Си. 

Тогда только имена, без вариантов.

Походу, с замангленными С++ тоже бы пришлось не сладко, там их надо было бы разманглить. Теоретически в них зашифрованы типы аргументов и возвращаемого значения, но это теоретически. Практически пришлось бы неслабо позаниматься сексом, чтобы извлечь эту информацию. (общепринятых стандартов там нет)  smile 

Цитата(boostcoder @  9.9.2011,  23:35 Найти цитируемый пост)
таки что, придется самому генерить инфу об предоставляемых объектах...  

да, это единственно нормальный способ.
PM MAIL   Вверх
boostcoder
Дата 10.9.2011, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



расстроился я что-то... оптимизма реализовать получение информации об экспортируемых функциях что-то поубавилось  smile 

Это сообщение отредактировал(а) boostcoder - 10.9.2011, 00:18
PM WWW   Вверх
null56
Дата 11.9.2011, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



boostcoder, что - то похожее я узнавал про dll, но получить информацию об аргументах - ПРОБЛЕМА
http://forum.vingrad.ru/forum/topic-302230...rocaddress.html

Добавлено через 9 минут и 5 секунд
вроде как народ советовал смотреть в сторону
http://en.wikipedia.org/wiki/Name_mangling
но это не дало мне особых результатов
PM MAIL   Вверх
fish9370
Дата 12.9.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: 2
Всего: 1



а что если, по стандартному методу?
- открываем объектный модуль (so/dll) и запрашиваем информацию об экспортируемых символах и закрываем обратно.. 
другой вопрос, что объектник может ничего не экспортировать, при этом сам будет себя регистрировать в ядре программы.. в таком случае лучше всего, наверно, предусмотреть символ (функцию), которая будет возвращать информацию о плагине.. 
хотя и вариант, с регистрацией в ядре спецальной функции очень часто встречается, но его минус - невозможность получить информацию извне программы..


--------------------
undefined
PM MAIL WWW ICQ   Вверх
xvr
Дата 12.9.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(fish9370 @  12.9.2011,  09:51 Найти цитируемый пост)
а что если, по стандартному методу?

Черевато  smile 

Цитата(fish9370 @  12.9.2011,  09:51 Найти цитируемый пост)
- открываем объектный модуль (so/dll) и 

и получаем SIGFAULT, после чего весь мэнэджер плагинов падает с грохотом  smile . Или просто получаем ошибку, при попытке загрузить so/dll (т.к. ей может не хватить других so/dll)

PM MAIL   Вверх
svlary
Дата 12.9.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(boostcoder @  9.9.2011,  21:44 Найти цитируемый пост)
получения информации об экспортируемых функциях

Может я не понял вопроса, но в линухе это делается так, к примеру :

Код

readelf -s libanl-2.12.2.so


За подробностями, естественно :

Код

man 1 readelf


PM MAIL   Вверх
xvr
Дата 12.9.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(svlary @  12.9.2011,  14:41 Найти цитируемый пост)
Может я не понял вопроса, но в линухе это делается так, к примеру :

Список функций - да (еще можно objdump вспомнить). А вот параметры и тип возвращаемого значения, увы нет.

PM MAIL   Вверх
boostcoder
Дата 12.9.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(xvr @  12.9.2011,  14:43 Найти цитируемый пост)
А вот параметры и тип возвращаемого значения, увы нет.

а если поработать в направлении поиска операций со стеком? так, по идее, можно хотябы узнать размеры аргументов. еще бы возможность отличить значение от указателя..
PM WWW   Вверх
newbee
Дата 12.9.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: нет
Всего: 19



Никаких стандартных способов получения этой информации нет. Нужно придумать универсальный плагинный интерфейс и по нему получать и список функций, и информацию о типах. Возможно будет намного проще в качестве аргументов экспортируемых функций использзовать только variant-ы, тогда информация о параметрах банально ограничится числом передаваемых параметров. Еще я поглядела твои темы, по-моему ты хочешь очень много динамики от статичного С++. Это конечно все можно сделать (и даже в виде патчей к компилятору, хе-хе), но семантически и синтаксически пользоваться и сопровождать, в т.ч. третьими лицами, это будет очень тяжело. Почему бы не воспользоваться более динамичными языками и вынести критические участки в с++?


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 12.9.2011, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(newbee @  12.9.2011,  15:39 Найти цитируемый пост)
Нужно придумать универсальный плагинный интерфейс

уже работаю в этом направлении.

Цитата(newbee @  12.9.2011,  15:39 Найти цитируемый пост)
использзовать только variant-ы

не-не-не smile 

Цитата(newbee @  12.9.2011,  15:39 Найти цитируемый пост)
ты хочешь очень много динамики от статичного С++

наоборот. я всегда стараюсь использовать статическую типизацию везде где только можно. и рантайм переносить в компайлтайм. по возможности как можно больше.

Цитата(newbee @  12.9.2011,  15:39 Найти цитируемый пост)
Еще я поглядела твои темы

наверное ты про эту тему? но так тема про добавление в с++ таких прелестей как reflection и introspection. а это невероятно восстребованно если знать как и для чего использовать. меня, с++ устраивает всем. но не устраивает отсутствием стандартной_сериализации, reflection и introspection smile 

Это сообщение отредактировал(а) boostcoder - 12.9.2011, 16:46
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1473 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.