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

Допустим следующею иерархию библиотек:
Код: 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
Кроссплатформенная загрузка библиотек (*.a, *.so, *.dll и пр.)
    #38691215
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nauseous,

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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


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

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


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

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

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

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


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