Ned
если ты собираешься зависеть от либы и линковать её динамически во время runtime, нужно ли в коде напрямую делать dlopen()?
Andrei
И вот он то и находится в статической либе, которая нужна чтобы использовать динамическую.
Ned
а, ну я вот как раз за этот код и спрашиваю
Andrei
Вот. Можно либо так да, либо когда делаешь свою шареную либу еще делать к ней маленький статический лоадер
Ned
то есть, если будешь зависеть от .so, тебе нужно сначала его dlopen() а потом использовать функции?
Ned
понял
Ned
все
Andrei
Вернее за тебя это сейчас компиляторы делабт.
Ned
ну да, ведь libstdc++ тоже по идее .so, но явно я её не подгружаю
Andrei
Угу.
Ned
вроде бы и qt не подгружают явно
Ned
хорошо
Ned
что будет, если скачать из винды noname.dll и сделать во время runtime с ней dlopen?
Andrei
Это делает код внутри статических либ, который вот кстати как раз вызывается перед main
Ned
архитектура та же, API не затрагивается
Andrei
Разные abi ничего не выйдет
Stanislav
Andrei
dlopen скорее всего даже не поймет где у виндовой либы искать таблицу с экпортом
Andrei
Ты ведь после dlopen еще делаешь что-то вроде givefunctionptrbyname
Andrei
get*
Sergey
А можно ручками загрузить файл бибилиотеки в память процесса, поискать экспортируемые функции, присвоить своим переменным с типом этих функций и юзать
Sergey
Ну, в винде так можно
Sergey
В линуксе тоже наверн
Ned
Sergey
Ну это да
Ned
спасибо мужики, вы офигенны
Andrei
Обращайся.
Ned
а где лежат исходники к самым ходовым либам?
Ned
или только качать в сети?
Ned
ядро хранит где-то свои исходники вроде, нет?
Stanislav
Stanislav
Andrei
Меджик
Ned
Stanislav
эм
Stanislav
там не меджик, там все разное
Sergey
PE/ELF
Andrei
Понятно что разное. Просто обычно в бинарных файлах сперва пишут меджик
Andrei
В винде во всех популярных форматах практически.
Andrei
Ну да.
Andrei
Что могут и виндовый попытаться открыт
Andrei
Кажется wine что-то такое и делает
Stanislav
ну только через вайн или моно) если PE файл - дотнетовский
Ned
вот еще вопрос
Ned
простой пример - файл wireless.h
Ned
в первых строках #ifdef __KERNEL__
Ned
как это понять? кто дефайнит кернел, если никто не подключён выше и ниже, если сам он предназначен для инклуда? если компиль или препроцессор, то где почитать о дефайнах компиля и препроцессора?
Andrei
Кто-то может писать код в ядро.
Stanislav
дефайный может передавать в параметрах компиля
Stanislav
-DKERNEL
Stanislav
-D__KERNEL__
Andrei
И если его код будет цеплять этот файл, то его код и будет до инклюда дефайнить кернел. Либо через флаг компилятору
Ned
Это супергруппа, тут можно редактировать свои сообщения
Ned
Отлично.
Ned
Тогда вторая часть вопроса
Ned
очевидно, что __cplusplus дефаайнит сам g++
Andrei
Смотри, заголовочные файлы просто вставляются тупо как текст в нужное место поэтому можно написать прям в файле #define __KERNEL__\r\n#include "wireless.h"
Andrei
И в этот файл подставить вайрлесс с разворачиванием ифов кернела.
Andrei
Andrei
Он еще много чего интересного дефайнит кстати.
Ned
ну так вот где прочитать, что именно он дефайнит и при каких условиях? может кто знает
Andrei
http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
Andrei
И там две соседние главы.
Andrei
Про макросы системы и макросы стандарта.
Ned
ага, спасибо
Ned
зачем делают #define NAME 1
Ned
зачем единичка?
Ned
Andrei
Вроде опять же для backward compatibility. Хотя наверное смысле нет. Но это как с __сplusplus.
Andrei
Там лежит обычно версия языка
Ned
хотя мб для того, чтобы если вдруг имя было использовано где-то, выскочила ошибка
Ned
вроде "откуда взялась тут эта единичка"?
Andrei
Да кстати, тоже вариант.
Ned
где-то полгода назад, когда я пытался читать код библиотек С, на меня это наводило страх и ужас
Ned
мол, кто это все писал и зачем так страшно
Ned
кстати, встретил #if defined(NAME) ...
Ned
defined() - это макрос или реальная чья-то функция?
Andrei
Часть языка