Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.) / 22 сообщений из 22, страница 1 из 1
08.07.2014, 23:18
    #38691205
nauseous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Всем привет, подскажите как реализовать динамическую загрузку библиотеки,
без платформенных данных / мета данных о библиотеки.

Допустим следующею иерархию библиотек:
Код: plaintext
1.
2.
3.
4.
- Статические (*.a - archive)
- Динамические (*.so - shared object)
	- Динамическая компоновка
	- Динамическая загрузка


Если я использую динамическая загрузку, и подгружаю через dlopen:

./main.c
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#include <dlfcn.h>

void main(void) {
	void * _dlopen;
	void (* _dlsym)();

	if(_dlopen = dlopen("./library.so", RTLD_NOW)) {
		if(_dlsym = dlsym(_dlopen, "main")) {
			_dlsym();
		}

		dlclose(_dlopen);
	}
}


./library.c
Код: c#
1.
2.
3.
4.
5.
#include <stdio.h>

void main(void) {
    printf("module\n");
}


./makefile
Код: c#
1.
2.
3.
4.
5.
all:
	gcc main.c -o main.bin -ldl
	gcc library.c -o library.so -fPIC -shared
clean:
	rm -f *.bin *.so



То получается что при компоновке библиотеки, она заточена под Linux (ELF)
Если выполнить тоже самое используя mingw (вместо gcc) то компоновка с виндавозными данными (РЕ или что там)

Получается разрабатывая кроссплатформенный проект, я привязываюсь к форматам:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Windows:
- main.exe
	- lib1.dll
	- lib2.dll
	- lib3.dll
	
Linux:
- main
	- lib1.so
	- lib2.so
	- lib3.so


А хотелось бы так:
Код: c#
1.
2.
3.
4.
5.
6.
- main.exe (Windows)
- main (Linux)
./lib:
	- lib1.bin
	- lib2.bin
	- lib3.bin


То есть иметь общий сред исполняемой части без платформенных данных,
и уже в исполняемым приложением выполнять если данные.

Ведь сути это не меняет, независимо от ОС, методы библиотеки это просто бинарный дамп,
и выполняет он одну и туже роль.

Например есть метод 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.
section .text
        global _start, _strlen
_strlen:
        push ebp
        mov ebp, esp

        mov ebx, [ebp+8]
        xor eax, eax
loop:
        cmp byte [ebx], 0h
        jz end
        inc eax
        inc ebx
        jmp loop

end:    pop ebp
        ret
_start:
        push dword [esp+8]
        call _strlen
        add esp, 4
        mov ebx, eax
        mov eax, 1
        int 80h


Линковщик его просто добавляет в бинар если он использовался при разработке (кажется так компиляторы юзают SDK),
и насколько я понимаю антологичный принцип в игровой индустрии (подгрудка RAW Data)

Подскажите как можно реализовать данную модель?

Спасибо!
...
Рейтинг: 0 / 0
08.07.2014, 23:35
    #38691215
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
nauseous,

Забудьте.
В теории это возможно, но на практике никто так не делает. Ибо бессмысленно.
Никакие реальные функции без рантайма С/С++ не работают.
А рантайм - это сразу привязка к платформе.
...
Рейтинг: 0 / 0
08.07.2014, 23:37
    #38691217
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
nauseousВедь сути это не меняет, независимо от ОС, методы библиотеки это просто
бинарный дамп, и выполняет он одну и туже роль.
Методы - возможно. А вот обёртка вокруг них, заголовок исполняемого файла, формат
сегментов, таблицы экспорта-импорта и релокации - чертовски платформозависимы.

И, кроме того, ты не мешай в одну кучу динамическую загрузку и статическую линковку. Т.е.
либо крестик сними, либо трусы надень используй dload(), либо указывай library.so
линкеру. Одновременно это уже перелёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.07.2014, 23:47
    #38691227
nauseous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Dimitry SibiryakovМетоды - возможно. А вот обёртка вокруг них, заголовок исполняемого файла, формат
сегментов, таблицы экспорта-импорта и релокации - чертовски платформозависимы.

Меня собственно методы и интересуют, вопрос как?
...
Рейтинг: 0 / 0
08.07.2014, 23:48
    #38691230
nauseous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Dimitry Sibiryakov...используй dload(), либо указывай library.so
линкеру. Одновременно это уже перелёт.

Это просто пример был, что-бы Вы суть идеи уловили
...
Рейтинг: 0 / 0
08.07.2014, 23:50
    #38691233
nauseous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Anatoly Moskovskynauseous,

Забудьте.
В теории это возможно, но на практике никто так не делает. Ибо бессмысленно.
Никакие реальные функции без рантайма С/С++ не работают.
А рантайм - это сразу привязка к платформе.
А если речь идет например о большем числе вычислительных методов, где рантайм вовсе не нужен?
...
Рейтинг: 0 / 0
08.07.2014, 23:51
    #38691234
nauseous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Разве нельзя в безопасном режиме той или иной ОС, пихнуть свою кучи и переместить указатель?
...
Рейтинг: 0 / 0
09.07.2014, 00:01
    #38691243
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
nauseousА если речь идет например о большем числе вычислительных методов, где рантайм вовсе не нужен?
Я ж говорю, теоретически можно.
Собирайте бинарники без рантайма, в перемещаемом формате, с генерацией карты символов.
Потом просто читайте бинарник в память, по карте символов определяйте адреса функций и делайте вызовы этих функций.
Но вот это ваше "если" оно сугубо гипотетическое, поэтому мне лень расписывать как это делать подробно.
...
Рейтинг: 0 / 0
09.07.2014, 00:05
    #38691244
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Нет. То что ты хочешь сделать нельзя.

Если тебе так сильно ломает делать два дистрибутива, то встрой в свою супер-программу интерпретатор како-либо ЯП и пиши все "подгружаемые" модули на нем. Тогда у тебя будет всего два бинарных модуля - запускалки интерпретаторов. Все остальное будет общим и в единственном экземпляре.
Смотри на скриптовые языки, на java, и тп.
...
Рейтинг: 0 / 0
09.07.2014, 00:11
    #38691248
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
nauseousDimitry SibiryakovМетоды - возможно. А вот обёртка вокруг них, заголовок исполняемого файла, формат
сегментов, таблицы экспорта-импорта и релокации - чертовски платформозависимы.

Меня собственно методы и интересуют, вопрос как?Ты уже увидел что для Линукса используется ELF, а для Винды PE форматы?
Вот берешь и пишешь самостоятельно систему расшифровывающую ну например PE. Соберешь ее на Линуксе - сможешь подгружать *.dll файлы. Будешь вместо dlopen() звать свою собственную функцию.

Доведешь эту фигню до ума - получишь Wine.
...
Рейтинг: 0 / 0
09.07.2014, 00:12
    #38691249
nauseous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Anatoly MoskovskynauseousА если речь идет например о большем числе вычислительных методов, где рантайм вовсе не нужен?
Я ж говорю, теоретически можно.
Собирайте бинарники без рантайма, в перемещаемом формате, с генерацией карты символов.
Потом просто читайте бинарник в память, по карте символов определяйте адреса функций и делайте вызовы этих функций.
Но вот это ваше "если" оно сугубо гипотетическое, поэтому мне лень расписывать как это делать подробно.
Получается нужно сделать свой IAT (Import Address Table) грубо говоря собственный мета формат..
Ну это если с костылями, просто уверен что я не первый кто захотел так сделать, вопрос и стоял Что? Где почитать можно
...
Рейтинг: 0 / 0
09.07.2014, 00:14
    #38691250
nauseous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Все спасибо! Пойду на ASM форуме общаться, видимо под c/c++ нет манны
...
Рейтинг: 0 / 0
09.07.2014, 08:50
    #38691396
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
nauseous,

а как быть с кроссплатформенностью и 32/64 бита ?
...
Рейтинг: 0 / 0
09.07.2014, 10:23
    #38691521
nauseous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Изопропила как быть с кроссплатформенностью и 32/64 бита ?
Изначально собирать 32 битный код, который в свою очередь будет работать и под 64 бита
...
Рейтинг: 0 / 0
09.07.2014, 10:26
    #38691528
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Как пример: один и тот же drweb32.dll используется на всех системах и разрядностях.
Другое дело, что применимость такого подхода сильно ограничена.
...
Рейтинг: 0 / 0
09.07.2014, 10:50
    #38691564
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
nauseousИзопропила как быть с кроссплатформенностью и 32/64 бита ?
Изначально собирать 32 битный код, который в свою очередь будет работать и под 64 бита
32 битную библиотеку в 64 битное приложение - никак не получится ( в отличие от 16/32)
...
Рейтинг: 0 / 0
09.07.2014, 10:51
    #38691566
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
Basil A. SidorovКак пример: один и тот же drweb32.dll используется на всех системах и разрядностях.
Другое дело, что применимость такого подхода сильно ограничена.
только будучи загруженным в отдельный 32-разрядный процесс и общение через какую либо форму RPC
...
Рейтинг: 0 / 0
09.07.2014, 11:31
    #38691650
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
nauseousDimitry SibiryakovМетоды - возможно. А вот обёртка вокруг них, заголовок исполняемого файла, формат
сегментов, таблицы экспорта-импорта и релокации - чертовски платформозависимы.

Меня собственно методы и интересуют, вопрос как?

Как-как -- ты же привёл код ...
Технически -- вот так, только это никому не нужно.
Ты тогда должен будешь каждую фукнцию и переменную преобразовывать к нужному типу (сигнатуре), и таким образом хранить информацию об этих структурах данных и фукнциях в твоей программе, причём независимо от таких же данных в библиотеке.

Теперь представь, что библиотека поменялась. Ты сам бдешь проверять, что изменилось, а что осталось прежним?
Представляешь себе примерно объём работы для такой валидации для библиотеки размером, например, с QT или POCO ?

Именно поэтому такие подходы и не применяют массово, только иногда грузят какие-то библиотеки-плагины со строго фиксированными заранее сигнатурами фукнций.
...
Рейтинг: 0 / 0
09.07.2014, 11:37
    #38691669
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
nauseousТо получается что при компоновке библиотеки, она заточена под Linux (ELF)
Если выполнить тоже самое используя mingw (вместо gcc) то компоновка с виндавозными данными (РЕ или что там)

Получается разрабатывая кроссплатформенный проект, я привязываюсь к форматам:
...


Если это нативный код, не Java какая-нибудь, то после компиляции и компановки ты однозначно и безповоротно привязываешься к бинарным форматам исполняемых образов приложений.


nauseousТо есть иметь общий сред исполняемой части без платформенных данных,
и уже в исполняемым приложением выполнять если данные.

Ведь сути это не меняет, независимо от ОС, методы библиотеки это просто бинарный дамп,
и выполняет он одну и туже роль.

Например есть метод strlen:

...
Линковщик его просто добавляет в бинар если он использовался при разработке (кажется так компиляторы юзают SDK),
и насколько я понимаю антологичный принцип в игровой индустрии (подгрудка RAW Data)


Ты, видимо, думаешь, что раз и там, и там одинаковый процессор, то машинный код можно просто так вот положить в файл и в нужный момент вызвать ? Нет, нельзя. И, кроме того, ещё есть разные процессоры. Там не будет на двух платформах почти одинакового кода strlen.

nauseousПодскажите как можно реализовать данную модель?


Никак. Ты просто не представляешь всю картину и не понимаешь, почему это невозможно.
...
Рейтинг: 0 / 0
09.07.2014, 11:38
    #38691671
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
nauseousРазве нельзя в безопасном режиме той или иной ОС, пихнуть свою кучи и переместить указатель?

Можно. Ты таким образом напишешь свою собственную ОС или виртуальную машину для исполнения своего кода.
Я уверен, ты этого пока не хочешь.
...
Рейтинг: 0 / 0
09.07.2014, 11:41
    #38691674
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
nauseousИзопропила как быть с кроссплатформенностью и 32/64 бита ?
Изначально собирать 32 битный код, который в свою очередь будет работать и под 64 бита

А как быть с разными процессорами ?
ARM или какой-нибудь SPARC не будет выполнять комманды ix86 ...
...
Рейтинг: 0 / 0
09.07.2014, 11:42
    #38691677
nauseous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
MasterZiv,

Спасибо, буду думать, пробовать, ошибаться )) в любом случае опыт
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.) / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]