Содержание:
DLL против LIB
Библиотека — это набор ресурсов, которые можно использовать для разработки приложений. Библиотека обычно состоит из подпрограмм, функций, классов, значений и типов. В процессе компоновки (обычно выполняется компоновщиком) библиотеки и исполняемые файлы ссылаются друг на друга. Файлы библиотеки делятся на статические и динамические библиотеки в зависимости от времени, когда подпрограммы загружаются в целевое приложение. Соответственно, файлы LIB представляют собой статически связанные библиотеки, а файлы DLL — это динамически подключаемые библиотеки.
Что такое DLL?
Библиотека динамической компоновки (более известная как DLL) — это реализация разделяемой библиотеки, разработанная Microsoft. Он использует расширения .dll, .ocx или .drv, и они используются в операционных системах Microsoft Windows и OS / 2. .dll используется обычными файлами DLL. Расширение .ocx используется библиотеками, содержащими элементы управления ActiveX, а расширение .drv используется устаревшими файлами системных драйверов. Формат файла DLL такой же, как у EXE-файлов Windows (переносимые исполняемые файлы в 32-битной / 64-битной Windows и новый исполняемый файл в 16-битной Windows). Следовательно, любая комбинация кода, данных и ресурсов может содержаться в файлах DLL (как и в файлах EXE). Фактически, файлы данных в формате DLL называются ресурсными DLL. Библиотеки значков (с расширением .icl) и файлы шрифтов (с расширениями .fon и .fot) являются примерами библиотек ресурсов.
Компоненты, называемые разделами, составляют DLL, и каждый раздел имеет свои собственные атрибуты, такие как доступный только для чтения / записи и исполняемый / неисполняемый файл. Разделы кода являются исполняемыми, а разделы данных — неисполняемыми. Разделы кода являются общими, а разделы данных являются частными. Это означает, что все процессы, использующие DLL, будут использовать одну и ту же копию кода, в то время как каждый процесс будет иметь свою собственную копию данных. Основная динамическая библиотека для Windows — это kernel32.dll, которая содержит базовые функции (функции, связанные с файлами и памятью) Windows. COM (компонентная объектная модель) — это расширение DLL до ООП (объектно-ориентированное программирование). Обычные библиотеки DLL проще в использовании, чем файлы COM.
Что такое LIB?
Файлы LIB представляют собой статические библиотеки (также известные как статически связанные библиотеки). Файлы LIB содержат набор подпрограмм, внешних функций и переменных. Файлы LIB разрешаются во время компиляции (в отличие от времени выполнения). Код фактически копируется в целевое приложение. Компилятор, компоновщик или связыватель выполнят это разрешение и создадут объектный файл и исполняемый файл. Этот процесс называется статическим процессом сборки.
В чем разница между DLL и LIB?
Библиотеки LIB можно вызывать во время компиляции, но библиотеки DLL можно вызывать только во время выполнения. Файлы LIB значительно больше, чем файлы DLL. Очень распространенная проблема с файлами DLL — это проблема с версией. Это происходит, когда код DLL изменяется, и приложение использует неправильную версию DLL. Это не проблема, связанная с файлами LIB. С точки зрения возможности повторного использования, при написании новых версий систем или совершенно новых приложений библиотеки DLL всегда лучше, чем LIB.
Характерные черты исполняемых файлов в Linux
Пользователи, активно применяющие в повседневной работе операционную систему Windows, свыкнули к тому, что программы имеют расширение «.exe». Такие файлы содержат скомпилированный программный код, или иными словами – последовательность байтов, которая загружается в оперативную память и выполняется процессором. Linux реализует асбсолютно другой подход. Ранее, изучая написание скриптов командного интерпретатора Bash, мы уже поспели рассмотреть пример создания исполняемого файла. Он в отличие от Windows представляет собой обыкновенный текстовый документ с набором команд. Его особенностью является то, что перед основным содержимым дополняется специальный комментарий, говорящий операционной системе Linux, какую программу использовать для интерпретации. Кроме скрипта, исполняемым файлом является и скомпилированная программа. Таким образом, все файлы в Linux смогут быть, как обычными текстовыми документами, так и исполняемыми программами. Отличие лишь в специальных флагах и преимуществах доступа операционной системы (множество элементов, находящихся в отношениях и связях друг с другом, которое образует определённую целостность, единство).
Загруженные DLL могут быть заражены
Хотя это и менее распространенная проблема, но библиотеки DLL, которые Вы скачиваете из источников, отличных от производителя, иногда могут быть загружены с помощью вирусов или других вредоносных программ, которые могут заразить Ваш компьютер. Это особенно справедливо для сайтов, которые не слишком осторожны в том, откуда они получают эти файлы. И вряд ли сайты расскажут о сомнительных источниках. Очень страшная часть заключается в том, что если Вы загружаете зараженный DLL-файл, Вы рискуете, предоставляя этому файлу более глубокий доступ, чем обычному зараженному файлу.
Хорошая новость заключается в том, что хорошее антивирусное приложение в реальном времени может обычно обнаруживать эти зараженные DLL-файлы до того, как они действительно будут сохранены в Вашей системе и не дадут им нанести какой-либо ущерб. Тем не менее, Вы должны помнить, что даже отличная антивирусная программа не может обеспечить Вам совершенную защиту. Если Вы привыкли загружать сомнительные файлы, скорее всего, Вы создаете точки восстановления. Но лучше просто избегать сайтов для загрузки DLL.
Запуск исполняемых файлов на Mac или Linux
То, как исполняемые файлы работают в Windows, полностью отличается от того, как программы работают на других платформах, таких как Linux или macOS. На этих платформах есть исполняемые файлы, но они не в формате EXE.
В Linux, например, любой файл может быть исполняемым, но для его запуска в качестве программы с использованием chmod требуется специальный флаг разрешений. Например, команда chmod + x file предоставит файлу с именем file разрешение на выполнение.
В macOS есть несколько иной метод запуска программного обеспечения. Если приложение не было установлено из App Store, и оно не от разработчика, которого он знает или которому доверяет, то приложение не будет запущено. Вам нужно будет разрешить это в меню «Системные настройки»> «Безопасность и конфиденциальность».
Однако как система на основе Unix macOS поддерживает команду chmod, что позволяет выполнять больше базовых сценариев с помощью приложения Terminal. Если вы, например, разработали сценарий Python, вы можете использовать команду chmod + x для его запуска.
Вы также можете использовать эмулятор WINE для Linux и macOS для запуска и установки EXE-файлов Windows на этих платформах. Разработанный для эмуляции определенных инструкций и библиотек Windows, использование WINE для запуска EXE-файла будет иметь разный уровень успеха.
Вы можете проверить, насколько популярное программное обеспечение будет работать с WINE, проверив База данных WineHQ.
Структура файлов [ править | править код ]
Файл EXE, создаваемый компоновщиком, состоит из двух частей:
- управляющая информация для загрузчика;
- загрузочный модуль.
Информация для загрузчика, описанная ниже, расположена в начале файла и образует так называемый заголовок. Сразу за ним следует тело загрузочного модуля, представляющее собой копию образа памяти задачи, построенной компоновщиком.
Стандартная часть заголовка имеет следующий формат :
00-01 4D5A — сигнатура файла .EXE; 02-03 Длина образа задачи по модулю 512 (то есть число полезных байт в последнем блоке). Компоновщики версий до 1.10 помещали в это поле 04; если оно имеет такое значение, его рекомендуется игнорировать); 04-05 Длина файла в блоках; 06-07 Число элементов таблицы настройки адресов; 08-09 Длина заголовка в 16-байтных параграфах. Используется для выяснения начала тела загрузочного модуля; 0A-0B Минимальный объём памяти, которую нужно выделить после конца образа задачи (в 16-байтных параграфах); 0C-0D Максимальный объём памяти, которую нужно выделить после конца образа задачи (в 16-байтных параграфах); 0E-0F Сегментный адрес начала стекового сегмента относительно начала образа задачи; 10-11 Значение SP при входе в задачу; 12-13 Контрольная сумма — ноль минус результат сложения без переноса всех слов файла; 14-15 Значение IP (счетчика команд) при входе в задачу; 16-17 Сегментный адрес начала кодового сегмента относительно начала образа задачи; 18-19 Адрес первого элемента таблицы настройки адресов относительно начала файла; 1A-1B Номер сегмента перекрытий (0 для корневого сегмента программы).
Далее следует таблица настройки адресов. Таблица состоит из элементов, число которых записано в байтах 06-07. Элемент таблицы настройки состоит из двух полей: 2-байтного смещения и 2-байтного сегмента, и указывает слова в загрузочном модуле, содержащее адрес, который должен быть настроен на место памяти, в которое загружается задача. Настройка производится следующим образом:
- В области памяти после резидентной части выполняющей загрузку программы строится префикс программного сегмента (PSP);
- Стандартная часть заголовка считывается в память;
- Определяется длина тела загрузочного модуля (разность длины файла 04-07 и длины заголовка 08-09 плюс число байт в последнем блоке 02-03). В зависимости от признака, указывающего загружать задачу в конец памяти или в начало, определяется сегментный адрес для загрузки. Этот сегмент называется начальным сегментом;
- Загрузочный модуль считывается в начальный сегмент;
- Таблица настройки порциями считывается в рабочую память;
- Для каждого элемента таблицы настройки к полю сегмента прибавляется сегментный адрес начального сегмента. В результате элемент таблицы указывает на слово в памяти, к которому прибавляется сегментный адрес начального сегмента;
- Когда таблица настройки адресов обработана, в регистры SS и SP записываются значения, указанные в заголовке, а к SS прибавляется сегментный адрес начального сегмента. В ES и DS записывается сегментный адрес начала PSP. Управление передается по адресу, указанному в заголовке (байты 14-17).
Дополнительная информация
DLL — это библиотека, которая содержит код и данные, которые могут использоваться одновременно более чем одной программой. Например, в Windows операционных системах DLL Comdlg32 выполняет общие функции, связанные с диалоговое окно. Каждая программа может использовать функции, содержащиеся в этом DLL, для реализации открытого диалоговое окно. Это способствует повторному использованию кода и эффективному использованию памяти.
С помощью DLL программа может быть модульной в отдельные компоненты. Например, программа бухгалтерского учета может быть продана модулем. Каждый модуль может быть загружен в основную программу во время запуска, если этот модуль установлен. Поскольку модули являются отдельными, время загрузки программы быстрее. Модуль загружается только при запросе этой функции.
Кроме того, обновления легче применять к каждому модуле, не затрагивая другие части программы. Например, у вас может быть программа заработной платы, и налоговые ставки меняются каждый год. Если эти изменения изолированы в DLL, вы можете применить обновление, не нуждаясь в сборке или установке всей программы снова.
В следующем списке описываются некоторые файлы, реализованные как DLLs в Windows операционных системах:
-
ActiveX Файлы элементов управления (.ocx)
Пример управления ActiveX — это управление календарем, которое позволяет выбрать дату из календаря.
-
Файлы панели управления (.cpl)
Примером файла .cpl является элемент, расположенный в панели управления. Каждый элемент — это специализированная DLL.
-
Файлы драйвера устройства (drv)
Пример драйвера устройства — это драйвер принтера, который управляет печатью на принтере.
Что такое DLL
Прежде чем мы начнем объяснять, почему Вы не должны загружать файлы библиотеки динамической связи (DLL) из Интернета, давайте сначала посмотрим, какие DLL-файлы есть. DLL-файл представляет собой библиотеку, содержащую набор кодов и данных для выполнения определенного действия в Windows. Затем приложения могут обращаться к этим DLL-файлам, когда им нужно выполнить какие-либо задачи. DLL-файлы во многом похожи на исполняемые файлы (EXE), за исключением того, что файлы DLL не могут быть непосредственно выполнены в Windows. Другими словами, Вы не можете дважды щелкнуть DLL-файл, чтобы запустить его так же, как и EXE-файл. Вместо этого файлы DLL предназначены для вызова другими приложениями. Фактически, они предназначены для одновременного вызова нескольких приложений. Ссылка «Link» названия DLL также предлагает другой важный аспект. Несколько DLL могут быть связаны друг с другом, так что, когда вызывается одна DLL, одновременно вызывается ряд других DLL.
В самой Windows широко используются библиотеки DLL, Вы можете увидеть их в папке C:\Windows\System32. В качестве примера того, о чем мы говорим, давайте рассмотрим системный файл Windows «comdlg32.dll». Этот файл, иначе известный как Библиотека общих диалоговых окон, содержит код и данные для построения многих общих диалоговых окон, которые Вы видите в Windows — диалоги для таких вещей, как открытие файлов, печать документов и т. д. Инструкции в этой DLL обрабатывают все: от приема и интерпретации сообщений, предназначенных для диалогового окна, для определения того, как диалоговое окно выглядит на Вашем экране. Очевидно, что несколько приложений могут одновременно обращаться к этой DLL, иначе Вы не сможете открыть диалоговое окно в нескольких приложениях за раз.
Библиотеки DLL допускают модульность и повторное использование кода, что означает, что разработчикам не нужно тратить время на создание кода с нуля для выполнения обычных функций. И хотя разработчики создадут свои собственные DLL для установки с помощью своих приложений, подавляющее большинство DLL-приложений, называемых приложениями, фактически связаны с Windows или с дополнительными пакетами, такими как Microsoft .NET Framework или Microsoft C ++ Redistributables. Другим большим преимуществом модульного кода является то, что обновления легче применять к каждой DLL, а не ко всему приложению, особенно когда эти библиотеки DLL не пришли от разработчика приложения. Например, когда Microsoft обновляет определенные библиотеки DLL в своей платформе .NET Framework, все приложения, использующие эти DLL, могут сразу воспользоваться обновленной защитой или функциональностью.
Несколько рекомендаций
Напоследок дам несколько советов, которые помогут обойтись без стартового кода CRT во многих случаях. Но помните, что это достигается за счет отказа от использования исключений, и работает не всегда. Как правило, начиная с какого-то объема кода, выигрыш от всех этих ухищрений сходит на нет, а неудобства отказ от CRT доставляет по-прежнему немалые.
Забудьте об этом, если используете MFC
Библиотека MFC требует наличия кода инициализации, и тут уж ничего не поделаешь. Если очень хочется использовать библиотеку оконных классов в сверхмалых проектах, посмотрите в сторону ATL/WTL и их расширений (например, Attila).
Используйте SEH вместо C++ Exceptions
Обработка исключений в стиле C++ неизбежно потребует стартового кода CRT. Если исключения использовать необходимо, попробуйте воспользоваться структурными исключениями Win32 с помощью ключевых слов __try, __except, __finally и т.д. Для их использования нужно подключить библиотеку импорта kernel32.lib.
Попробуйте позаимствовать необходимую функцию из исходных файлов CRT
Visual C++ поставляется с большим набором исходных файлов, в число которых входит и реализация CRT. Их изучение, кстати, приносит и еще одну выгоду — это поможет разобраться, как именно устроена поддержка стандартной библиотеки. В общем, «Use the source, Luke»!
Используйте директиву #pragma intrinsic
Некоторые функции, требующие инициализации CRT, могут быть попросту вставлены компилятором в точку вызова. К ним относятся cos, strlen и многие другие. Изучите документацию на #pragma intrinsic и опцию компилятора /Oi.
Для преобразования типов воспользуйтесь Automation API
Это мощнейшее средство преобразования данных разных типов ничего не будет стоить — кроме, разве что, лишних тактов процессора.
Можно использовать как функции высокого уровня VariantChangeType/VariantChangeTypeEx, так и вспомогательные функции преобразования вида VarXXXFromYYY. В приведенном выше блоке кода, например, поможет функция VarI4FromR8:
double t; long a; VarI4FromR8(t, &a); // Никаких проблем с внешними ссылками |
Использование Automation API позволит не только решить проблему преобразования, описанную выше, но и учесть при этом региональные настройки — например, получить локализованную строку даты. Кроме того, функция VarBstrCmp поможет при сравнении строк Unicode (но будьте осторожны с ней — в старых версиях Windows она отличается от новых реализаций, также нужно иметь установленный Service Pack 4 или выше для VC, иначе заголовочный файл будет содержать некорректное описание этой функции).
Для использования этих функций необходимо подключить библиотеку импорта oleaut32.lib.
Эта статья опубликована в журнале
RSDN Magazine
#0. Информацию о журнале можно найти здесь
Как создать исполняемый файл в Windows
Если вы хотите создать свои собственные исполняемые файлы в Windows, вы можете, но это не так просто, как переименовать файл и добавить .exe в его конец.
Вам нужно будет закодировать программное обеспечение, которое вы хотите запустить, на выбранном вами языке программирования, а затем скомпилировать его как файл, который можно будет выполнить. Однако большинство пользователей захотят создать более простые исполняемые файлы, такие как файлы установщика для установки программного обеспечения.
Вы можете использовать встроенный мастер IExpress для этого в Windows, но это программное обеспечение очень старое и некоторое время не обновлялось. Лучший вариант — использовать открытый исходный код. Inno Setup или, для основных самораспаковывающихся EXE-файлов, вы можете использовать 7-молния.
EXE-файл, созданный с помощью 7-Zip, на самом деле является файлом архива SFX. Этот архивный файл в формате EXE автоматически извлекает все включенные файлы на ваш компьютер, что делает его идеальным для простого развертывания программного обеспечения.
Если вы хотите поделиться файлами с несколькими пользователями, не беспокоясь о том, что у них установлено правильное программное обеспечение, создание такого файла будет хорошим вариантом.
Чтобы создать EXE-файл с помощью 7-ZIP, поместите файлы в папку в проводнике Windows. Щелкните папку правой кнопкой мыши, затем нажмите 7Zip> Добавить в архив.
В поле «Параметры» установите флажок «Включить архив SFX». Вы также захотите установить формат архива на 7z, метод сжатия на LZMA2 и уровень сжатия на нормальный. Нажмите ОК, чтобы создать файл.
Хотя это не настоящий EXE-файл, он выглядит и действует как один, что упрощает создание исполняемого файла, который может распространять программное обеспечение или файлы, созданные вами вместе с другими.
В противном случае, если вы хотите создать «настоящий» исполняемый файл, вам потребуется научиться программировать.
Средства устранения неполадок DLL
Для устранения неполадок DLL доступны несколько средств. Вот некоторые из этих средств.
Уокер зависимостей
Средство Уокер зависимостей может повторно сканировать все зависимые DLLs, используемые программой. При открываемой программе в «Уолкер зависимостей» уолкер зависимостей делает следующие проверки:
- Уокер зависимостей проверяет отсутствующие DLLs.
- Уокер зависимостей проверяет файлы программы или DLLs, которые не являются допустимыми.
- Уокер зависимостей проверяет соответствие функций импорта и экспорту.
- Уокер зависимостей проверяет на наличие ошибок круговой зависимости.
- Уокер зависимостей проверяет для модулей, которые не являются действительными, так как модули для другой операционной системы.
С помощью Уолкера зависимостей можно документировать все DLLs, которые использует программа. Это может помочь предотвратить и устранить проблемы DLL, которые могут возникнуть в будущем. В следующем каталоге при установке Visual Studio 6.0 расположено приложение Dependency Walker.
Универсальное решение проблем DLL
Средство универсального решения проблем DLL (DUPS) используется для аудита, сравнения, документа и отображения данных DLL. В следующем списке описываются утилиты, которые составляют средство DUPS:
-
Dlister.exe
Эта утилита регистрирует все DLLs на компьютере и регистрирует сведения в текстовом файле или файле базы данных.
-
Dcomp.exe
Эта утилита сравнивает DLLs, перечисленные в двух текстовых файлах, и создает третий текстовый файл, содержащий различия.
-
Dtxt2DB.exe
Эта утилита загружает текстовые файлы, созданные с помощью Dlister.exe и Dcomp.exe в базу данных dllHell.
-
DlgDtxt2DB.exe
Эта утилита предоставляет графический пользовательский интерфейс (GUI) версии Dtxt2DB.exe утилиты.
База данных справки DLL
База данных справки по DLL поможет вам найти конкретные версии DLLs, установленные программным обеспечением Майкрософт.
Загруженные DLL библиотеки могут быть устаревшими
Итак, теперь Вы знаете, что такое DLL файл, так почему его нельзя скачать из интернета, если он отсутствует в системе?
Наиболее распространенной проблемой, с которой Вы можете столкнуться с загруженными DLL, является то, что они устарели. Многие из сайтов там выкладывают свои DLL, просто загружая их со своих компьютеров. Вероятно, Вы уже можете увидеть проблему. Большинство из этих сайтов просто хотят Ваш трафик, и как только DLL загружается, у них мало стимулов, чтобы файл постоянно обновлялся. Добавьте к этому, что производители обычно не выпускают обновленные DLL публично как отдельные файлы, и Вы можете видеть, что даже сайты, которые пытаются обновлять файлы, вряд ли будут очень успешными.
Также существует дополнительная проблема, что библиотеки DLL обычно интегрируются в пакеты. Обновление одной DLL в пакете часто сопровождается обновлениями других связанных DLL-файлов в одном пакете, что означает, что даже если Вы получите обновленный DLL-файл, Вы не получите связанных файлов, которые также были обновлены.
В чем разница между файлом LIB статической библиотеки и динамической библиотекой?
Lib в статической библиотеке:Lib содержит сам код функциональности (т. Е. Индекс, включая функции, включая реализацию), и напрямую добавляют код непосредственно при компиляции.
Lib в динамической библиотеке:LIB содержит информацию (индекс) местоположения функции в DLL-файле и файле функции, и код реализации функций загружен DLL, загруженной в пространстве процесса.
Примечания:Lib используется в компиляции, а DLL используется при работе. Если вы хотите завершить компиляцию исходного кода, вам нужно только lib; если вы хотите запустить динамическую ссылку, вам нужно только DLL.
Риски исполняемых файлов (EXE)
Когда вы запускаете исполняемый файл, вы даете ему разрешение на выполнение содержащихся в нем инструкций. Так работает любое программное обеспечение, от простых сценариев из нескольких строк до сложного программного обеспечения с миллионами строк кода.
Прежде чем запускать или создавать исполняемый файл, вы должны знать о потенциальных рисках. Исполняемые файлы могут содержать в исходном коде инструкции, которые могут повредить ваш компьютер.
Он может сказать вашему компьютеру удалить другие файлы, или он может указать вашему компьютеру отправить информацию во внешний источник. Это определение вредоносного ПО, созданного, чтобы причинить вред за ваш счет.
Перед запуском любого исполняемого файла, особенно если он запрашивает административные разрешения в Контроль учетных записей пользователей всплывающее окно, вы должны просканировать файл на наличие вредоносных программ с помощью Windows Security или вашего собственного стороннего антивирусного программного обеспечения, такого как Malwarebytes. Вам также следует устанавливать или запускать программное обеспечение только из источников, которым вы абсолютно доверяете.
Если вы создаете собственное программное обеспечение для запуска, вы должны убедиться, что код не предназначен для доступа к каким-либо важным файлам. Хотя Windows обычно предотвращает несанкционированный доступ к системным файлам с помощью UAC, дважды проверьте свой код перед запуском, чтобы убедиться, что программное обеспечение не может нанести вред вашему ПК.