По структуре исходный текст библиотеки похож на исходный текст программы, за исключением того, что текст библиотеки начинается с ключевого слова library, а не слова program. Например:
  После заголовка следуют секции:
 · подключения модулей;
 · описания констант, типов данных, переменных;
 · описания процедур и функций.
 Процедуры и функции — это главное, что должно быть в динамически загружаемой библиотеке, поскольку лишь они могут быть экспортированы.
 Если в теле библиотеки объявлены некоторые процедуры,
   | procedure BubleSort(var Arr: array of Integer);procedure QuickSort(var Arr: array of Integer); |  
 
 то это еще не значит, что они автоматически будут доступны для вызова извне. Для того чтобы это разрешить, нужно поместить имена процедур в специальную секцию exports, например:
   | exports BubleSort, QuickSort; |  
 
 Перечисленные в секции exports процедуры и функции отделяются запятой, а в конце всей секции ставится точка с запятой. Секций exports может быть несколько, и они могут располагаться в программе произвольным образом.
 Посмотрим на пример исходного текста простейшей динамически загружаемой библиотеки SortLib (посмотреть приложение).
 Пример простейшей динамически загружаемой библиотеки.
 library SortLib; procedure BubleSort(var Arr: array of Integer); var I, J, T: Integer;begin for I := Low(Arr) to High(Arr) - 1 do for J := I + 1 to High(Arr) do if Arr[I] > Arr[J] then begin T := Arr[I]; Arr[I] := Arr[J]; Arr[J] := T; end;end;exports BubleSort; begin end. Она содержит единственную процедуру BubleSort, сортирующую массив целых чисел методом «пузырька»:
 Исходный текст динамически загружаемой библиотеки заканчивается операторным блоком begin...end, в который можно вставить любые операторы для подготовки библиотеки к работе. Эти операторы выполняются во время загрузки библиотеки основной программой. Наша простейшая библиотека SortLib не требует никакой подготовки к работе, поэтому ее операторный блок пустой.