Трансляция, интерпретация и компиляция
Если рассматривать термин «трансляция» в самом широком смысле этого слова, то трансляция — это процесс восприятия компьютером какой-либо программы, которая написана с помощью некоторого формального языка, в более узком смысле — процесс преобразования программы, написанной на одном языке, в программу — на другом языке программирования, при том, что семантически (по смыслу) эти программы будут равносильны друг другу.
Транслятор – это программа или техническое средство, выполняющее преобразование программы, представленной на одном из языков программирования, в программу на другом языке, в определенном смысле равносильную первой.
Компиляция — процесс преобразования объектов на исходном языке в объекты на любом другом (выходном) языке, после чего исполняется полученная таким образом программа.
Компилятор – это программа, предназначенная для трансляции исходного текста программы с высокоуровневого языка в объектный код. Входной информацией для компилятора является описание алгоритма или программа на языке программирования. На выходе компилятора – эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код).
Обучение работе в программе ArtCAM 2011 Pro Видеоурок №3 часть 3 Компоновка векторов
Интерпретацией называют процесс, когда исходный код построчно анализируется, одновременно с тем (без предварительной компиляции) выполняются необходимые действия, т. е. в итоге происходит покомандное выполнение программы.
Интерпретатор анализирует и тут же выполняет программу покомандно, по мере поступления ее исходного кода на вход интерпретатора.
Компоновка – это один из этапов создания исполняемого файла.
Компоновщик – модуль системы программирования или самостоятельная программа, которая собирает результирующую программу из объектных модулей и стандартных библиотечных модулей. Этот процесс называется компоновкой, его результатом и будет исполняемый файл. С процедурой интерпретации компоновка не связана.
Исполняемый файл – это файл, который может быть обработан или выполнен компьютером без предварительной трансляции. Обычно исполняемый файл получается в результате компиляции и компоновки объектных модулей и содержит машинные команды и/или команды операционной системы.
Язык, на котором представлена входная программа, называется исходным языком, а сама программа — исходным кодом. Выходной язык называется целевым языком или объектным кодом.
Язык процессоров (машинный код) обычно является низкоуровневым.
Система программирования включает следующие программные компоненты: редактор текста; транслятор с соответствующего языка; компоновщик (редактор связей).
Источник: swinopes.livejournal.com
Компоновка программы
После устранения ошибок и получения объектного модуля можно приступать к следующему этапу — созданию исполняемого (загрузочного) модуля, или, как еще называют этот процесс, к компоновке программы. Главная цель этого этапа — преобразовать код и данные в объектных файлах в их перемещаемое выполняемое отображение.
Этапы компиляции на Си: предобработка, трансляция, компоновка
Чтобы понять, в чем здесь суть, нужно разобраться, зачем вообще разделяют процесс создания исполняемого модуля на два этапа — трансляцию и компоновку. Это сделано намеренно, чтобы можно было объединять вместе модули, написанные на одном и том же или на разных языках.
Формат объектного файла позволяет при определенных условиях объединить несколько отдельно отранслированных исходных модулей в один модуль. При этом в функции компоновщика входит разрешение внешних ссылок (ссылок на внешние процедуры и переменные) в этих модулях. Результатом работы компоновщика является создание загрузочного файла с расширением .ехе. После этого операционная система может загрузить такой файл в память и выполнить его.
Полный формат командной строки для запуска компоновщика довольно сложен (в этой и в большинстве следующих глав мы в основном будем использовать упрощенный формат):
TLINK[ключи] список_объектных_файлов [,имя_загрузочного_модуля]
[,имя_файла_карты][,имя_файла_библиотеки] [,имя_файла_определений] ,имя_ресурного_файла)
Параметры командной строки для запуска компоновщика перечислены далее.
— ключи — необязательные параметры, управляющие работой компоновщика. Список наиболее часто используемых ключей приведен в приложении В (h|Hwww.piter.com/doWnload). Каждому ключу должен предшествовать символ- (дефис) или / (слеш). При задании имен ключей имеет значение регистр символов.
— список_объектных_файлов — обязательный параметр, содержащий список компонуемых файлов с расширением .obj. Файлы должны быть разделены пробелами или знаком + (плюс), например:
tlink /v prog + mdf + fdr
При необходимости имена файлов снабжают указанием пути к ним.
— имя_загрузочного_модуля — необязательный параметр, обозначающий имя формируемого загрузочного модуля. Если оно не указано, то имя загрузочного модуля будет совпадать с первым именем в списке имен объектных файлов.
— имя_файла_карты — необязательный параметр, наличие которого обязывает ком- поновщик создать специальный файл с картой загрузки. В ней перечисляются имена, адреса загрузки и размеры всех сегментов, входящих в программу.
— имя_файла_библиотеки — необязательный параметр, который представляет собой путь к файлу библиотеки (.lib). Этот файл создается и обслуживается специальной утилитой tlib.exe пакета TASM. Утилита позволяет объединить часто используемые подпрограммы в виде объектных модулей в один файл. В дальнейшем можно просто указывать в командной строке tlink.exe имена нужных для компоновки объектных модулей и файл библиотеки, в котором следует искать эти подпрограммы. Если компонуется Windows-приложение, то на месте параметра имя_файла_библиотеки должно указываться имя библиотеки импорта (глава 16).
— имя_файла_определений — необязательный параметр, который представляет собой путь к файлу определений (.def). Этот файл используется при компоновкеWindows-приложений (глава 16).
— имя_ресурсного_файла — необязательный параметр, который представляет собой путь к файлу с ресурсами Windows-приложения (.res). Этот файл используется при компоновке Windows-приложений (глава 16).
Рассмотренный нами формат командной строки используется и для 32-разрядного варианта компоновщика tlink32.exe.
Существует возможность задания параметров командной строки компоновщика в текстовом файле. Для этого нужно создать файл с именем tlink.cfg (tlink32.cfg). При вызове компоновщика tlink.exe с параметром tlihk.cfg (ttink32.exetlirik32.cfg) ему будет передано содержимое файла tlink.cfg (tlink32.cfg). Например, текст конфигурационного файла tlink32.cfg для создания исполняемого файла Wmdows-приложения с отладочной информацией должен выглядеть так:
/v ‘
/Twe
Так же как и в случае команды tasm.exe, совсем не обязательно запоминать подробно синтаксис команды tlink.exe. Для того чтобы получить список ключей программы tlink.exe, достаточно просто запустить ее без параметров.
Для выполнения нашего примера запустим программу tlink.exe командной строкой вида
tlink.exe /v prg_6_l.obj.
В результате вы получите исполняемый модуль с расширением .ехе — рrg_6_1 .ехе.
Получив исполняемый модуль, не спешите радоваться. К сожалению, устранение синтаксических ошибок еще не гарантирует, что программа будет хотя бы запускаться, не говоря уже о ее правильной pa6oтe. Поэтому обязательным этапом процесса разработки является отладка?
Источник: studopedia.ru
Коды, ассемблеры. Трансляция и компоновка. Исходный и объектный модули, исполняемая программа. Компиляция и интерпретация. Данные как объект обработки.
Когда вы пишете программу на ассемблере, вы просто пишете команды процессору. Команды процессору — это просто коды или коды операций или опкоды. Опкоды — фактически «читаемый текст»- версии шестнадцатеричных кодов. Из-за этого, ассемблер считается самым низкоуровневым языком программирования, все в ассемблере непосредственно преобразовывается в шестнадцатеричные коды. Другими словами, у вас нет компилятора, который преобразовывает язык высокого уровня в язык низкого уровня, ассемблер только преобразовывает коды ассемблера в данные.
Числа в ассемблере могут представляться в двоичной, десятеричной или шестнадцатеричной системе. Для того, чтобы показать в какой системе использовано число надо поставить после числа букву. Для бинарной системы пишется буква b (пример: 0000010b, 001011010b), для десятеричной системы можно ничего не указывать после числа или указать букву d (примеры: 4589, 2356d), для шестнадцатеричной системы надо указывать букву h, шестнадцатеричное число надо обязательно писать с нулём в начале (примеры: 00889h, 0AC45h, 056Fh, неправильно F145Ch, С123h).
Компоновка программы создает готовую для работы программу, которая называется также исполняемой программой или загрузочным модулем. При этом решаются две основные задачи:
§ если в программе используются функции, например, sin, exp и т.д., соответствующие им программные модули выбираются из библиотеки подпрограмм соответствующей системы программирования и вставляются в объектный модуль;
§ объектный модуль преобразуется в соответствии с реальными адресами основной памяти, куда будет размещаться программа для выполнения.
Процесс преобразования программы, написанной на одном языке программирования, в программу на другом языке.
Как правило, трансляция — это создание программы в машинных кодах, которую можно выполнять. Трансляция обеспечивает включение библиотечных подпрограмм, модулей, процедур в итоговую программу на машинном языке.
Различают два вида трансляции:
§ компиляцию, при которой результат получается в виде готовой программы, выполняемой независимо от исходного текста программы;
§ интерпретацию, при которой трансляция и выполнение программы происходит покомандно.
Исходный модуль — это текстовый файл части программы, написанный на каком-либо языке программирования. Исходный модуль обычно оформляется специальным образом для того, чтобы он мог быть оттранслирован (в объектный модуль).
Объектный модульпрограммы получается в результате трансляции исходного текста модуля. В состав объектного модуля программы помещается оттранслированный код модуля, информация для редактора связей, позволяющая объединять модули в единую программу, и отладочная информация (переменные, константы, метки и их адреса). Для объектного модуля по умолчанию используется имя файла, совпадающее с именем файла исходного модуля и с расширением obj.
Под трансляцией в самом широком смысле можно понимать процесс восприятия компьютером программы, написанной на некотором формальном языке. При всем своем различии формальные языки имеют много общего и, в принципе, эквиваленты с точки зрения потенциальной возможности написать одну и ту же программу на любом из них.
На самом деле сложно подвести под одну схему имеющееся многообразие языков программирования,
Компиляция — преобразование объектов (данных и операций над ними) с входного языка в объекты на другом языке для всей программы в целом с последующим выполнением полученной программы в виде отдельного шага.
Интерпретация — анализ отдельного объекта на входном языке с одновременным выполнением (интерпретацией).
Следовательно, компиляция и интерпретация отличаются не характером и методами анализа и преобразования объектов программы, а совмещением фаз обработки этих объектов во времени. То есть при компиляции фазы преобразования и выполнения действий разнесены во времени, но зато каждая из них выполняется над всеми объектами программы одновременно. При интерпретации, наоборот, преобразование и выполнение действий объединены во времени, но для каждого объекта программы.
Если посмотреть на эти различия несколько с другой стороны, то можно заметить, что интерпретатор непосредственно выполняет действия, связанные с определением или преобразованием объектов программы, а компилятор — переводит их на другой (не обязательно машинный язык). Отсюда можно сделать несколько выводов:
· для выполнения программы, написанной на определенном формальном языке после ее компиляции необходим интерпретатор, выполняющий эту программу, но уже записанную на выходном языке компилятора;
· процессор и память любого компьютера (а в широком смысле и вся программная среда, создаваемая операционной системой, является интерпретатором машинного кода);
· в практике построения трансляторов часто встречается случай, когда программа компилируется с входного языка на некоторый промежуточный уровень (внутренний язык), для которого имеется программный интерпретатор. Многие языковые системы программирования, называемые интерпретаторами, на самом деле имеют фазу компиляции во внутренне представление, на котором производится интерпретация.
31)Паради́гмы программи́рования
Паради́гма программи́рования— это система идей и понятий, определяющих стиль написания компьютерных программ, а также образ мышления программиста.
Важно отметить, что парадигма программирования не определяется однозначно языком программирования; практически все современные языки программирования в той или иной мере допускают использование различных парадигм. Так на языке Си, который не является объектно-ориентированным, можно работать в соответствии с принципами объектно-ориентированного программирования, хотя это и сопряжено с определёнными сложностями; функциональное программирование можно применять при работе на любом императивном языке, в котором имеются функции (для этого достаточно не применять присваивание), и т.д. Своим современным значением в научно-технической области термин «парадигма» обязан, по-видимому, Томасу Куну
32)Объектно-ориентированное программирование. Логическое и функциональное программировании.
Объе́ктно-ориенти́рованное, или объектное, программи́рование (в дальнейшем ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов. В случае языков с прототипированием вместо классов используются объекты-прототипы.
ООП возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны
Основные понятия
Абстрагирование — это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция — это набор всех таких характеристик.
Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.
Наследование— это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом.
Полиморфизм— это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Прототип — это объект-образец, по образу и подобию которого создаются другие объекты. Объекты-копии могут сохранять связь с родительским объектом, автоматически наследуя изменения в прототипе; эта особенность определяется в рамках конкретного языка.
Целью логического и функционального программирования является вывод решений и они тесно связаны с задачами, решаемыми в искусственном интеллекте и экспертных системах (ЭС). На начальном этапе развития систем искусственного интеллекта (СИИ) и ЭС даже выделился целый класс специализированных языков программирования: языки логического и функционального программирования.
Процедурная программа состоит из последовательности операторов и предложений, управляющих последовательностью их выполнения. В основе такого программирования лежат взятие значения какой-то переменной, совершение над ним действия и сохранение нового значения с помощью оператора присваивания, и так до тех пор пока не будет получено желаемое окончательное значение.
Функциональная программа состоит из совокупности определений функций. Функции, в свою очередь, представляют собой вызовы других функций и предложений, управляющих последовательностью вызовов. Каждый вызов возвращает некоторое значение и вызвавшую ее функцию, вычисление которой после этого продолжается. Этот процесс повторяется до тех пор, пока запустившая процесс функция не вернет результат пользователю.
В логических языках программирования для решения задачи достаточно описания структуры и условий этой задачи. Поскольку последовательность и способ выполнения программы не фиксируется, как при описании алгоритма, программы могут в принципе работать в обоих направлениях, то есть программа может как на основе исходных данных вычислить результаты, так и по результатам — исходные данные.
Наиболее известными языками функционального программирования являются ЛИСП и РЕФАЛ, а логического — Пролог. Однако, с развитием языков программирования (в частности, с появлением объектно-ориентированных языков) и баз данных область их применения сузилась. Так ЛИСП используется как оболочка Автокад, а РЕФАЛ как средство для построения метаязыков и метакомпиляторов.
Поэтому в дальнейшем внимание будет уделено не рассмотрению конкретных языков функционального и логического программирования, а подходам, лежащим в основе их реализации и являющимися базовыми при создании систем принятия решений.
ЛИСП и Пролог в свое время являлись базовыми для создания экспертных систем. Поэтому, для того чтобы наглядно представить какой круг задач решается с помощью логического и функционального программирования, рассмотрим задачи, возникающие в ЭС. Прежде всего, это задачи прямого и обратного вывода
Виды программирования
Логическое программирование — парадигма программирования, основанная на автоматическом доказательстве теорем, а также раздел дискретной математики, изучающий принципы логического вывода информации на основе заданных фактов и правил вывода. Логическое программирование основано на теории и аппарате математической логики с использованием математических принципов резолюций. (язык Пролог).
Процедурное (императивное) программирование является отражением архитектуры традиционных ЭВМ, которая была предложена фон Нейманом в 1940-х годах. Теоретической моделью процедурного программирования служит алгоритмическая система под названием Машина Тьюринга.
Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих процедуру решения задачи. Основным является оператор присваивания, служащий для изменения содержимого областей памяти. Концепция памяти как хранилища значений, содержимое которого может обновляться операторами программы, является фундаментальной в императивном программировании.
Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Таким образом, с точки зрения программиста имеются программа и память, причем первая последовательно обновляет содержимое последней.
Процедурный язык программирования предоставляет возможность программисту определять каждый шаг в процессе решения задачи. Особенность таких языков программирования состоит в том, что задачи разбиваются на шаги и решаются шаг за шагом. Используя процедурный язык, программист определяет языковые конструкции для выполнения последовательности алгоритмических шагов.
Источник: infopedia.su
Русские Блоги
Процесс компиляции и компоновки языка C должен преобразовать программу C (исходный код), которую мы пишем, в программу (исполняемый код), которую можно запускать на оборудовании, и ее необходимо скомпилировать и связать. Компиляция — это процесс перевода исходного кода в текстовой форме в объектные файлы на машинном языке. Связывание — это процесс организации объектных файлов, кода запуска операционной системы и файлов библиотеки для формирования окончательного загружаемого и исполняемого кода.
Схема процесса выглядит следующим образом:
- Препроцессор: конвертируйте файлы .c в файлы .i, используется команда gcc: gcc -E, что соответствует команде предварительной обработки cpp;
- Компилятор: конвертируйте файлы .c / .h в файлы .s, используется команда gcc: gcc –S, что соответствует команде компиляции cc –S;
- Ассемблер: конвертируйте файлы .s в файлы .o, используется команда gcc: gcc -c, соответствующая команде сборки:
- Компоновщик: преобразуйте файл .o в исполняемую программу, используется команда gcc: gcc, которая соответствует команде ссылки ld;
- Загрузчик: загружает исполняемые программы в память и запускает их, загрузчик и ld-linux.so.
Во-вторых, процесс компиляции
Процесс компиляции можно разделить на два этапа: компиляция и сборка.
2.1 Компиляция
Компиляция означает, что компилятор читает исходную программу (символьный поток), анализирует лексику и грамматику и преобразует инструкции языка высокого уровня в функционально эквивалентный ассемблерный код.
Процесс компиляции исходных файлов состоит из двух основных этапов:
Первый этап — этоЭтап предварительной обработки выполняется перед этапом формальной компиляции. На этапе предварительной обработки содержимое исходного файла будет изменено в соответствии с инструкциями предварительной обработки, которые были помещены в файл.
В основном занимаются следующими аспектами:
- Инструкции по определению макроса, такие как #define a b. Для этого типа псевдо-инструкций перед компиляцией необходимо заменить все a в программе на b, но строковая константа a не заменяется. Также есть #undef, он отменяет определение определенного макроса, так что вхождение строки не будет заменено в будущем.
- Инструкции условной компиляции, такие как #ifdef, #ifndef, #else, #elif, #endif и т. Д. Введение этих псевдо-инструкций позволяет программистам решать, какие коды компилятор будет обрабатывать, определяя различные макросы. Предварительный компилятор отфильтрует ненужные коды по соответствующим файлам.
- Заголовочный файл содержит инструкции, такие как #include «FileName» или #include и т. Д. Эта директива добавляет все определения из файла заголовка в выходной файл, который он создает для обработки компилятором.
- Специальные символы, предварительный компилятор может распознавать некоторые специальные символы. Например, логотип LINE в исходной программе будет интерпретироваться как текущий номер строки (десятичное число), а FILE будет интерпретироваться как имя исходной программы C, которая в настоящее время компилируется. Предварительно скомпилированная программа заменит эти строки, появляющиеся в исходной программе, соответствующими значениями.
Основная цель файла заголовка — сделать определенные определения доступными для нескольких различных исходных программ на языке C. Это включает в себя расположение файла заголовка, то есть путь поиска. Правила поиска в заголовочном файле следующие:
- Все поиски файла заголовка будут начинаться с -I
- Затем найдите путь, указанный в переменных среды C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH
- Найдите каталог по умолчанию (/ usr / include, / usr / local / include, /usr/lib/gcc-lib/i386-linux/2.95.2/include . )
Второй этап — этап компиляции и оптимизации,Работа компилятора заключается в прохождении лексического анализа и грамматического анализа, после подтверждения того, что все инструкции соответствуют грамматическим правилам, он переводится в эквивалентное промежуточное представление кода или ассемблерный код.
2.2 Сборка
Ассемблер фактически относится к процессу перевода ассемблера (как) кода языка ассемблера в целевые машинные инструкции. В целевом файле хранится машинный код целевой программы, эквивалентной исходной программе. Целевой файл состоит из сегментов. Обычно объектный файл состоит как минимум из двух разделов:
- Сегмент кода: этот сегмент содержит в основном программные инструкции. Этот раздел обычно доступен для чтения и выполнения, но не для записи.
- Сегмент данных: в основном хранит различные глобальные переменные или статические данные, которые будут использоваться в программе. Как правило, сегменты данных доступны для чтения, записи и выполнения.
2.3 Целевой файл (исполняемый и связываемый формат)
- Перемещаемые файлы: генерируются компилятором и ассемблером и могут быть объединены с другими перемещаемыми объектными файлами для создания исполняемого или общего объектного файла;
- Общий объектный файл: особый тип перемещаемого объектного файла, который может быть добавлен в объектный файл при компоновке (статическая разделяемая библиотека) или динамически загружен в память и выполнен во время загрузки или во время выполнения (динамическая разделяемая библиотека);
- Исполняемый (Executable) файл: он создается компоновщиком и может быть напрямую загружен в память загрузчиком, чтобы действовать как файл для выполнения процесса.
2.4 Статические и динамические библиотеки
Статическая библиотека — это отдельный файл, сформированный путем упаковки связанных целевых модулей. Используйте команду ar.
Преимущества статических библиотек:
- Программисту не нужно явно указывать все целевые модули, которые необходимо связать, потому что спецификация — это трудоемкий и подверженный ошибкам процесс;
- При компоновке компоновщик копирует из статической библиотеки только целевой модуль, на который ссылается программа, тем самым уменьшая размер исполняемого файла на диске и в памяти.
Динамическая библиотека — это специальный объектный модуль, который может быть загружен по любому адресу памяти во время выполнения или связан с любой программой.
Преимущества динамических библиотек:
- Обновите динамическую библиотеку без повторного связывания; для больших систем повторное связывание — очень трудоемкий процесс;
- Он может использоваться несколькими программами во время работы, требуется только одна копия в памяти, что экономит память.
В-третьих, процесс ссылки
Компоновщик в основном соединяет связанные объектные файлы для создания загружаемых и исполняемых объектных файлов. Основная работа компоновщика — разрешение и перемещение таблицы символов.
3.1 Время перехода по ссылке:
- При компиляции, когда исходный код компилируется в машинный код (отвечает статический компоновщик);
- При загрузке, то есть при загрузке программы в память (отвечает загрузчик);
- Во время выполнения это реализуется приложением (за это отвечает динамический компоновщик).
3.2 Роль ссылок (повторное использование программного обеспечения):
- Сделайте возможной отдельную компиляцию;
- Динамическая привязка (привязка): раздельное определение, реализация и использование
3.3 Путь поиска в статической библиотеке (отвечает статическим компоновщиком)
- gcc сначала ищет от -L;
- Найдите путь поиска, указанный в переменной среды LIBRARY_PATH;
- Затем найдите каталог по умолчанию / lib / usr / lib / usr / local / lib, который был написан в программе, когда изначально была написана компиляция gcc.
3.4 Путь поиска в динамической библиотеке (отвечает динамический компоновщик)
- Путь поиска динамической библиотеки, указанный при компиляции целевого кода -L;
- Путь поиска динамической библиотеки, указанный переменной среды LD_LIBRARY_PATH;
- Путь поиска динамической библиотеки, указанный в файле конфигурации /etc/ld.so.conf;
- Путь поиска динамической библиотеки по умолчанию / lib / usr / lib / / usr / local / lib
3.5 Статическая ссылка (во время компиляции)
Компоновщик копирует код функции из ее местоположения (объектный файл или библиотека статических ссылок) в окончательную исполняемую программу. Таким образом, эти коды будут загружены в виртуальное адресное пространство процесса при выполнении программы. Библиотека статических ссылок на самом деле представляет собой набор объектных файлов, каждый из которых содержит один или группу связанных кодов функций в библиотеке.
Чтобы создать исполняемый файл, компоновщик должен выполнить основные задачи:
- Анализ символов: свяжите определение и ссылку на символы в целевом файле;
- Перемещение: соотнесите определение символа с адресом памяти, а затем измените все ссылки на символ.
Последующее исследование таблицы символов и анализа символов и анализа перемещений.
3.6 Динамическая ссылка (загрузка, время выполнения)
Таким образом, определение функции находится в объектном файле библиотеки динамической компоновки или совместно используемого объекта. На этапе компоновки компиляции библиотека динамической компоновки предоставляет только таблицу символов и небольшой объем другой информации, чтобы гарантировать, что все ссылки на символы определены, чтобы гарантировать беспрепятственное прохождение компиляции. Компоновщик динамического компоновщика (ld-linux.so) динамически загружает разделяемую библиотеку в соответствии с записанным определением символа разделяемого объекта во время работы, а затем завершает перемещение. Когда этот исполняемый файл выполняется, все содержимое библиотеки динамической компоновки будет отображаться в виртуальное адресное пространство соответствующего процесса во время выполнения. Программа динамической компоновки найдет соответствующий код функции в соответствии с информацией, записанной в исполняемой программе. Чтобы
В-четвертых, процесс загрузки
Загрузчик загружает исполняемый файл из внешней памяти в память и выполняет его. Образ памяти при выполнении процесса в Linux выглядит следующим образом:
Процесс загрузки следующий:
Загрузчик сначала создает образ памяти, как показано на рисунке выше, а затем копирует целевой файл в сегменты данных и кода в памяти в соответствии с таблицей заголовков сегментов. Затем загрузчик переходит к точке входа в программу (адрес символа _start) и выполняет код запуска.Последовательность вызова кода запуска следующая:
Пять общих инструментов для достижения целей
Система UNIX предоставляет ряд инструментов, помогающих понять и обработать целевые файлы. Пакет GNUbinutils также предоставляет большую помощь. Эти инструменты включают:
- AR: создание статической библиотеки, вставка, удаление, список и извлечение членов;
- СТРОКИ: Список всех печатаемых строк в целевом файле;
- STRIP: удалить информацию таблицы символов из целевого файла;
- NM: перечислить символы, определенные в таблице символов целевого файла;
- РАЗМЕР: укажите имя и размер раздела в целевом файле;
- READELF: отображение полной структуры целевого файла, включая всю информацию, закодированную в заголовке ELF.
- OBJDUMP: отображает всю информацию о целевом файле.Самая полезная функция — дизассемблировать двоичные инструкции в разделе .text.
- LDD: список общих библиотек, которые требуются исполняемому файлу во время выполнения.
Интеллектуальная рекомендация
App App App Applet RSA шифрование использует jsencrypt
App App App Applet RSA шифрование использует jsencrypt Перспективы: хочу использовать открытый ключ RSA, чтобы перейти на задний план, чтобы обеспечить безопасность данных, хотя приложение может быть .
Примечания к исследованию тензорного потока (6): API обнаружения абстракции от тензорного потока
1. Установите cuda9.0 и cudnn7.0 Установить cuda9.0 очень просто, непосредственно загрузите cuda_9.0.176_windows.exe и cudnn-9.0-windows7-x64-v7.zip, здесь загрузка cudnn должна быть зарегистрирована.
Переучивание C ++ — «C ++ primer» (1) краткое изложение небольших знаний
12. Когда заранее неизвестно, сколько пользовательских вводов должно использоваться, обычно используется контур, однако, в дополнение к установке переменной управления контуром, условие цикла также мо.
【Openjudge】 торговля акциями
Общее время: 1000 мс Ограничение памяти: 65536 КБ Описание В последнее время все больше и больше людей привлекаются к работе на фондовом рынке, и Ай Фу также немного продвинулся. Помня, что «фон.
Источник: russianblogs.com