Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144

В языке C++ есть понятие "динамическая библиотека" ?

17.07.2019, 10:00. Показов 3766. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача: научить программу на C++ подключать дополнительный функционал в Run-Time.

В языке C++ вообще, есть понятие динамическая библиотека (типа .DLL в MS-Windows) ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.07.2019, 10:00
Ответы с готовыми решениями:

Понятие модуль и библиотека в PHP
Объясните, что такое модуль и что такое библиотека в PHP и в чем отличие, в двух словах. Спасибо

Есть ли такое понятие, как Visual C#? Если есть, чем он отличается от обычного C#?
Суть в том, что как только ознакомлюсь с C#, планирую переходить на Unity. Пару раз встречал формулировку Visual C# и вот подумал, а что...

Динамическая библиотека и библиотека импорта
Дали лабораторную, где надо создать динамическую библиотеку, при этом подключить ее в одном случае надо статически, а в другом -...

40
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.07.2019, 13:27
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от eva2326 Посмотреть сообщение
У вас какие то сложности с пониманием русского текста?
Вот лишь бы не вникать в то что вам пишут... Окей, я покопался в настройках gcc. Библиотека у нас будет из одной функции, состоящей из одного return. Proof of concept, так что и так сойдет.
C++
1
2
3
4
int myFunction()
{
    return 1234;
}
Компиляция:
gcc -ffreestanding -c testc.c -o rawcode.o
ld -Ttext 0xA00000000 --oformat binary -o rawcode rawcode.o
Получаем файл rawcode, который собственно и содержит код библиотеки. Я где-то говорил что будут dll?

Загрузка под Линуксом. Извините, мне лень настраивать виртуалку чтобы тоже самое сделать под Виндой:
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
25
26
27
28
29
30
#include<sys/mman.h>
#include<cassert>
#include<fstream>
#include<iostream>
 
typedef int (*externalLib)();
 
int main()
{
    //адрес загрузки
    void*libAddr=(void*)(0xA00000000);
 
    //шмат памяти для загрузки и исполнения библиотеки по фиксированному адресу
    void*res=mmap(libAddr,
                  65536,
                  PROT_READ|PROT_WRITE|PROT_EXEC,
                  MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE,
                  -1,
                  0);
    assert(res==libAddr);
 
    //офигеть, сложная загрузка
    std::ifstream stream("/home/zero/rawcode",std::ios_base::binary|std::ios_base::in);
    stream.read((char*)libAddr,65536);
 
    //исполнение единственной функции и вывод результата
    externalLib libFunction=reinterpret_cast<externalLib>(reinterpret_cast<std::uintptr_t>(libAddr));
    std::cout<<libFunction()<<std::endl;
    return 0;
}
4
 Аватар для COKPOWEHEU
4132 / 2710 / 433
Регистрация: 09.09.2017
Сообщений: 12,042
18.07.2019, 13:30
Цитата Сообщение от gng Посмотреть сообщение
Может я отстал от жизни, но cygwin всегда запускал только ВЕНДОВЫЕ бинарники, собранные из линуксовых сорцов.
Точно сказать не могу, сам не пользовался. Но вроде бы и "инородные" бинарники можно было загружать.
eva2326, пример с wine я уже привел, он примерно так и работает. Программа расковыривает заголовок PE файла, находит адрес начала и запускает выполнение. Поскольку внутри одной процессорной архитектуры инструкции будут одними и теми же, это работает. И точно так же подгружаются нативные/сторонние библиотеки. Так что ничего невозможного тут нет.
Правда, это уже ни разу не решение исходной задачи ТСа, поскольку динамическая библиотека не загружается-вызывается, а долго и упорно парсится чтобы найти начало кода, потом возня со страницами памяти.
Не говоря уж о том, что не так уж часто встречаются разделяемые библиотеки, совсем не имеющие зависимостей на системные. Не говоря о том, что даже так код вызова для разных ОС будет сильно отличаться. Не говоря о том, что даже в пределах одной ОС, но на разном железе придется пересобирать библиотеку (инструкции-то разные).
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.07.2019, 13:42
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Правда, это уже ни разу не решение исходной задачи ТСа, поскольку динамическая библиотека не загружается-вызывается, а долго и упорно парсится чтобы найти начало кода, потом возня со страницами памяти.
Полагаю, если покопаться, найдутся и готовые решения для загрузки standalone программ. Которые собственно так и называются "Standalone program". Хотя да, зачем оно нужно, если можно просто пересобрать библиотеку под все платформы, это уже большой вопрос.
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
18.07.2019, 13:54
Цитата Сообщение от Renji Посмотреть сообщение
если покопаться, найдутся и готовые решения для загрузки standalone программ.
Насчет запуска Вендовых бинарников под Линем - это wine, как выше указал уважаемый COKPOWEHEU.
В обратную сторону решений не встречал. Да и wine существует благодаря достаточно стабильному Вендовому ABI.
Под Линем даже, чтобы программа без пересборки запустилась на большинстве дистров той же архитектуры, ее обычто компилируют в среде RHEL 6 или даже RHEL 5 десятилетней давности. Как-то этот вопрос обсуждали на форуме. Я скомпилировал требуемую программу в Centos 5 и она действительно запустилась на всех Дистрах, которые были у участников тусовки.
PS. Использовалось, конечно, принятое в Линуксах динамическое связывание.
PS2. Эту проблему сейчас с успехом решают контейнеры. Может, это причина успеха неуклюжего, на мой взляд Докера.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
18.07.2019, 13:55
Цитата Сообщение от Renji Посмотреть сообщение
Я где-то говорил что будут dll?
Дальше не читала.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.07.2019, 14:02
Цитата Сообщение от eva2326 Посмотреть сообщение
Дальше не читала.
Да и до этого, видимо, не очень.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
18.07.2019, 14:07
Цитата Сообщение от gng Посмотреть сообщение
Насчет запуска Вендовых бинарников под Линем - это wine, как выше указал уважаемый COKPOWEHEU.
Я немного про другое толкую. Freestanding бинарики не имеют отношения ни к Винде, ни к Линуксу. Они рассчитаны на запуск в условиях отсутствия какой либо ОС в принципе. Соответственно, им глубоко начихать что там у вас за дистрибутив, главное дайте примитивный загрузчик кода из файла в память. Не думаю что в составе ОС такой загрузчик есть, но какие-то сторонние разработки скорее всего имеются. Благо, на столько примитивный загрузчик собирается на коленке.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
18.07.2019, 15:50
Цитата Сообщение от Croessmah Посмотреть сообщение
Да и до этого, видимо, не очень.
Лишь бы брякнуть?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.07.2019, 16:01
Цитата Сообщение от eva2326 Посмотреть сообщение
Лишь бы брякнуть?
Ваш подражатель.

Добавлено через 8 минут
eva2326, это я к тому, что Renji всё доступно написал еще в сообщении #15, но Вы, видимо, не читали ничего из того, что он писал.
Получается, лишь бы брякнуть.
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
18.07.2019, 16:05
Цитата Сообщение от Renji Посмотреть сообщение
Я немного про другое толкую. Freestanding бинарики не имеют отношения ни к Винде, ни к Линуксу. Они рассчитаны на запуск в условиях отсутствия какой либо ОС в принципе.
Если они работают, не используя системных вызовов, то это, видимо, специфические расчетные рутины. Они, возможно и востребованы, но к вопросу ТС, насколько я понимаю, мало имеют отношения.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.07.2019, 16:05
gng, так ведь Renji об этом сразу написал.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
18.07.2019, 16:19
Цитата Сообщение от Croessmah Посмотреть сообщение
это я к тому, что Renji всё доступно написал
Могу предложить прочитать см #18.

Правда для этого нужно уметь не только читать,
но и понимать смысл прочитанного.

С последним у вас не очень.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.07.2019, 16:25
eva2326, ну и? Вам написали общий алгоритм и даже привели пример под линукс.
В чем проблема?
Ах, да, Вы же не читали.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
18.07.2019, 17:37
Цитата Сообщение от Croessmah Посмотреть сообщение
В чем проблема?
У меня нет проблем.

Кроме проблемы назойливости некоторых глупых мальчиков.

Которые либо не умеют читать,
либо просто слишком глупые и не понимают смысла написанного.

Не знаете, на этом форуме можно как нибудь поставить занудного идиота в игнор?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.07.2019, 17:44
Цитата Сообщение от eva2326 Посмотреть сообщение
Не знаете, на этом форуме можно как нибудь поставить занудного идиота в игнор?
Знаю.
Цитата Сообщение от eva2326 Посмотреть сообщение
У меня нет проблем.
Ага, мы видим.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
18.07.2019, 17:48
Цитата Сообщение от Croessmah Посмотреть сообщение
Знаю.
Как?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
18.07.2019, 17:51
Цитата Сообщение от eva2326 Посмотреть сообщение
Как?
Профиль -> Список игнорирования.
Там разберетесь.
0
 Аватар для COKPOWEHEU
4132 / 2710 / 433
Регистрация: 09.09.2017
Сообщений: 12,042
19.07.2019, 11:20
Цитата Сообщение от Renji Посмотреть сообщение
Окей, я покопался в настройках gcc
В mingw не работает, ld ругается:
Code
1
2
$ x86_64-w64-mingw32-ld -Ttext 0xA00000000 --oformat binary -o rawcode rawcode.o
x86_64-w64-mingw32-ld: cannot perform PE operations on non PE output file 'rawcode'
Цитата Сообщение от Croessmah Посмотреть сообщение
eva2326, ну и? Вам написали общий алгоритм и даже привели пример под линукс.
Вопрос-то был в кросс-запуске. Пример Renji не доказывает этого, увы. Мне с ходу не удалось собрать виндовый бинарник чтобы проверить.
eva2326, сформулируйте свою позицию, что вы хотите доказать.
Что бинарный код, собранный под одну ОС не может быть в принципе запущен на другой без эмуляции? Это не так.
Что динамическая библиотека под одну ОС не может быть в принципе запущена на другой? Тоже не так.
Что динамическая библиотека под одну ОС не может быть запущена на другой штатными средствами? Обычно это так, но не всегда.
Ну а с тем, что подобные извращения обычно не имеют смысла, поскольку библиотеку можно пересобрать под конкретную ОС, или использовать JIT-компиляцию или скрипты, никто вроде и не спорит.
0
 Аватар для eva2326
1685 / 513 / 107
Регистрация: 17.05.2015
Сообщений: 1,524
19.07.2019, 11:47
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
сформулируйте свою позицию
Моя позиция заключается в том, что:
Цитата Сообщение от Renji Посмотреть сообщение
вполне можно таскать универсальным бинариком
Только если вы - мазохист-извращенец.

Либо есть особенная причина когда цена себя оправдывает:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
определенного геморроя это стоит.
И не факт, что в итоге такой бинарник взлетит.
Из-за зашкаливающего количества противопоказаний.

Но это все не так важно.
Важно, что автора темы интересовал вопрос кросс-платформенности.

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

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
что вы хотите доказать.
Я ничего никому не доказываю, если не имею с этого профита.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
с тем, что подобные извращения обычно не имеют смысла
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
никто вроде и не спорит.
Я и не спорила.
Просто предложила продемонстрировать на практике.
Что бы наглядно продемонстрировать всем (включая новичков),
какой гемморой на самом деле скрывался под приятны словосочетанием:
Цитата Сообщение от Renji Посмотреть сообщение
вполне можно таскать универсальным бинариком
Ещё можно Машку за ляшку.
В телегу с разберу.
Козу на возу.
Не ковыряй в носу!
(ц)
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
19.07.2019, 13:57
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Пример Renji не доказывает этого, увы.
Под Linux он Вам привел пример.
Под Windows с бинарником, собранным в Linux - ниже.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Мне с ходу не удалось собрать виндовый бинарник чтобы проверить.
MinGW != GCC. Но в этом и прелесть.
Собираем бинарник на Linux, у меня он получился 72 байта.
Закидываем его в Windows. Пишем код для загрузки:
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
25
26
27
28
29
30
31
32
#include <windows.h>
#include <iostream>
#include <cstdlib>
 
typedef int __cdecl (*externalLib)();
 
int main()
{
    HANDLE hFile = CreateFile("rawcode", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (!hFile) {
        std::cout << "VirtualAlloc failed" << std::endl;
        return EXIT_FAILURE;
    }
    DWORD fileSize = GetFileSize(hFile, NULL);
    std::cout << "filesize: " << fileSize << std::endl;
    LPVOID code_buffer = VirtualAlloc(nullptr, fileSize, MEM_COMMIT, PAGE_EXECUTE);
    if (!code_buffer) {
        std::cout << "VirtualAlloc failed" << std::endl;
        return EXIT_FAILURE;
    }
    DWORD oldProtect;
    if (!VirtualProtect(code_buffer, fileSize, PAGE_EXECUTE_READWRITE, &oldProtect)) {
        std::cout << "VirtualProtect failed" << std::endl;
        return EXIT_FAILURE;
    }
 
    DWORD countOfBytesRead;
    ReadFile(hFile, code_buffer, fileSize, &countOfBytesRead, NULL);
    externalLib libFunction = reinterpret_cast<externalLib>(code_buffer);
    std::cout << "result: " << libFunction();
    return 0;
}
собираем: g++ -o main main.cpp
запускаем:
Название: Безымянный.png
Просмотров: 47

Размер: 941 байт
ЧТД.

Применены VirtualAlloc и VirtualProtect, как и писал Renji.
Также он писал, что для выполнения потребуется "загрузчик" кода.
Т.е. обо всём этом уже сказано выше.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.07.2019, 13:57

Динамическая библиотека
Обращаюсь снова к вам за помощью, есть 2 программы, методы которых нужно реализовать в динамической библиотеке. Суть обращения к...

Динамическая библиотека
Как создать динамическую библиотеку, Объясните пожалуйста все пошагово. На Visual С++

Динамическая библиотека
Всем привет. Надо подключить библиотеку а) статически б)динамически И траблы есть с обоими пунктами. А) когда я подключаю...

Динамическая Библиотека
Имеется динамическая библиотека Windows (Dynamic Link Library &quot;.dll&quot;). В ней написаны функции, классы и структуры. Каким образом мне...

Динамическая библиотека
Создать динамическую библиотеку, которая содержит функции преобразования строки символов из прописных в строчные и наоборот. Очередное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru