Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Всем привет, подскажите как реализовать динамическую загрузку библиотеки, без платформенных данных / мета данных о библиотеки. Допустим следующею иерархию библиотек: Код: plaintext 1. 2. 3. 4. Если я использую динамическая загрузку, и подгружаю через dlopen: ./main.c Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ./library.c Код: c# 1. 2. 3. 4. 5. ./makefile Код: c# 1. 2. 3. 4. 5. То получается что при компоновке библиотеки, она заточена под Linux (ELF) Если выполнить тоже самое используя mingw (вместо gcc) то компоновка с виндавозными данными (РЕ или что там) Получается разрабатывая кроссплатформенный проект, я привязываюсь к форматам: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. А хотелось бы так: Код: c# 1. 2. 3. 4. 5. 6. То есть иметь общий сред исполняемой части без платформенных данных, и уже в исполняемым приложением выполнять если данные. Ведь сути это не меняет, независимо от ОС, методы библиотеки это просто бинарный дамп, и выполняет он одну и туже роль. Например есть метод strlen: ./strlen.asm Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Линковщик его просто добавляет в бинар если он использовался при разработке (кажется так компиляторы юзают SDK), и насколько я понимаю антологичный принцип в игровой индустрии (подгрудка RAW Data) Подскажите как можно реализовать данную модель? Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 23:18 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
nauseous, Забудьте. В теории это возможно, но на практике никто так не делает. Ибо бессмысленно. Никакие реальные функции без рантайма С/С++ не работают. А рантайм - это сразу привязка к платформе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 23:35 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
nauseousВедь сути это не меняет, независимо от ОС, методы библиотеки это просто бинарный дамп, и выполняет он одну и туже роль. Методы - возможно. А вот обёртка вокруг них, заголовок исполняемого файла, формат сегментов, таблицы экспорта-импорта и релокации - чертовски платформозависимы. И, кроме того, ты не мешай в одну кучу динамическую загрузку и статическую линковку. Т.е. либо крестик сними, либо трусы надень используй dload(), либо указывай library.so линкеру. Одновременно это уже перелёт. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 23:37 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovМетоды - возможно. А вот обёртка вокруг них, заголовок исполняемого файла, формат сегментов, таблицы экспорта-импорта и релокации - чертовски платформозависимы. Меня собственно методы и интересуют, вопрос как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 23:47 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov...используй dload(), либо указывай library.so линкеру. Одновременно это уже перелёт. Это просто пример был, что-бы Вы суть идеи уловили ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 23:48 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskynauseous, Забудьте. В теории это возможно, но на практике никто так не делает. Ибо бессмысленно. Никакие реальные функции без рантайма С/С++ не работают. А рантайм - это сразу привязка к платформе. А если речь идет например о большем числе вычислительных методов, где рантайм вовсе не нужен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 23:50 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Разве нельзя в безопасном режиме той или иной ОС, пихнуть свою кучи и переместить указатель? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 23:51 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
nauseousА если речь идет например о большем числе вычислительных методов, где рантайм вовсе не нужен? Я ж говорю, теоретически можно. Собирайте бинарники без рантайма, в перемещаемом формате, с генерацией карты символов. Потом просто читайте бинарник в память, по карте символов определяйте адреса функций и делайте вызовы этих функций. Но вот это ваше "если" оно сугубо гипотетическое, поэтому мне лень расписывать как это делать подробно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 00:01 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Нет. То что ты хочешь сделать нельзя. Если тебе так сильно ломает делать два дистрибутива, то встрой в свою супер-программу интерпретатор како-либо ЯП и пиши все "подгружаемые" модули на нем. Тогда у тебя будет всего два бинарных модуля - запускалки интерпретаторов. Все остальное будет общим и в единственном экземпляре. Смотри на скриптовые языки, на java, и тп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 00:05 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
nauseousDimitry SibiryakovМетоды - возможно. А вот обёртка вокруг них, заголовок исполняемого файла, формат сегментов, таблицы экспорта-импорта и релокации - чертовски платформозависимы. Меня собственно методы и интересуют, вопрос как?Ты уже увидел что для Линукса используется ELF, а для Винды PE форматы? Вот берешь и пишешь самостоятельно систему расшифровывающую ну например PE. Соберешь ее на Линуксе - сможешь подгружать *.dll файлы. Будешь вместо dlopen() звать свою собственную функцию. Доведешь эту фигню до ума - получишь Wine. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 00:11 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskynauseousА если речь идет например о большем числе вычислительных методов, где рантайм вовсе не нужен? Я ж говорю, теоретически можно. Собирайте бинарники без рантайма, в перемещаемом формате, с генерацией карты символов. Потом просто читайте бинарник в память, по карте символов определяйте адреса функций и делайте вызовы этих функций. Но вот это ваше "если" оно сугубо гипотетическое, поэтому мне лень расписывать как это делать подробно. Получается нужно сделать свой IAT (Import Address Table) грубо говоря собственный мета формат.. Ну это если с костылями, просто уверен что я не первый кто захотел так сделать, вопрос и стоял Что? Где почитать можно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 00:12 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Все спасибо! Пойду на ASM форуме общаться, видимо под c/c++ нет манны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 00:14 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
nauseous, а как быть с кроссплатформенностью и 32/64 бита ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 08:50 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Изопропила как быть с кроссплатформенностью и 32/64 бита ? Изначально собирать 32 битный код, который в свою очередь будет работать и под 64 бита ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 10:23 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Как пример: один и тот же drweb32.dll используется на всех системах и разрядностях. Другое дело, что применимость такого подхода сильно ограничена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 10:26 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
nauseousИзопропила как быть с кроссплатформенностью и 32/64 бита ? Изначально собирать 32 битный код, который в свою очередь будет работать и под 64 бита 32 битную библиотеку в 64 битное приложение - никак не получится ( в отличие от 16/32) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 10:50 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovКак пример: один и тот же drweb32.dll используется на всех системах и разрядностях. Другое дело, что применимость такого подхода сильно ограничена. только будучи загруженным в отдельный 32-разрядный процесс и общение через какую либо форму RPC ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 10:51 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
nauseousDimitry SibiryakovМетоды - возможно. А вот обёртка вокруг них, заголовок исполняемого файла, формат сегментов, таблицы экспорта-импорта и релокации - чертовски платформозависимы. Меня собственно методы и интересуют, вопрос как? Как-как -- ты же привёл код ... Технически -- вот так, только это никому не нужно. Ты тогда должен будешь каждую фукнцию и переменную преобразовывать к нужному типу (сигнатуре), и таким образом хранить информацию об этих структурах данных и фукнциях в твоей программе, причём независимо от таких же данных в библиотеке. Теперь представь, что библиотека поменялась. Ты сам бдешь проверять, что изменилось, а что осталось прежним? Представляешь себе примерно объём работы для такой валидации для библиотеки размером, например, с QT или POCO ? Именно поэтому такие подходы и не применяют массово, только иногда грузят какие-то библиотеки-плагины со строго фиксированными заранее сигнатурами фукнций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 11:31 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
nauseousТо получается что при компоновке библиотеки, она заточена под Linux (ELF) Если выполнить тоже самое используя mingw (вместо gcc) то компоновка с виндавозными данными (РЕ или что там) Получается разрабатывая кроссплатформенный проект, я привязываюсь к форматам: ... Если это нативный код, не Java какая-нибудь, то после компиляции и компановки ты однозначно и безповоротно привязываешься к бинарным форматам исполняемых образов приложений. nauseousТо есть иметь общий сред исполняемой части без платформенных данных, и уже в исполняемым приложением выполнять если данные. Ведь сути это не меняет, независимо от ОС, методы библиотеки это просто бинарный дамп, и выполняет он одну и туже роль. Например есть метод strlen: ... Линковщик его просто добавляет в бинар если он использовался при разработке (кажется так компиляторы юзают SDK), и насколько я понимаю антологичный принцип в игровой индустрии (подгрудка RAW Data) Ты, видимо, думаешь, что раз и там, и там одинаковый процессор, то машинный код можно просто так вот положить в файл и в нужный момент вызвать ? Нет, нельзя. И, кроме того, ещё есть разные процессоры. Там не будет на двух платформах почти одинакового кода strlen. nauseousПодскажите как можно реализовать данную модель? Никак. Ты просто не представляешь всю картину и не понимаешь, почему это невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 11:37 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
nauseousРазве нельзя в безопасном режиме той или иной ОС, пихнуть свою кучи и переместить указатель? Можно. Ты таким образом напишешь свою собственную ОС или виртуальную машину для исполнения своего кода. Я уверен, ты этого пока не хочешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 11:38 |
|
||
|
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
|
|||
|---|---|---|---|
|
#18+
nauseousИзопропила как быть с кроссплатформенностью и 32/64 бита ? Изначально собирать 32 битный код, который в свою очередь будет работать и под 64 бита А как быть с разными процессорами ? ARM или какой-нибудь SPARC не будет выполнять комманды ix86 ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2014, 11:41 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38691250&tid=2019382]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
192ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 299ms |

| 0 / 0 |
