Низкоуровневый взгляд на динамические ELF-библиотеки
Complex applications work with dynamically linked libraries. Statically linked applications would be very large and have lack of flexibility as with dynamic libraries, because one library can be used by several applications at once. The purpose of this report is precisely to focus on all low-level features of working with these libraries, including such mechanisms like ELF sections, symbol relocations, GOT(global offset table), PLT(procedure linkage table).
Введение
На примере языка программирования Си можно выделить три основных этапа с момента написания программного кода до работы получившейся программы в операционной системе.
Это препроцессинг, компиляция, компоновка/линковка. Остановимся на последнем этапе. К этому времени инструкции в процессе компиляции в основном сгенерированы. Компоновщик – это программа, которая выбирает адреса для всех символов(глобальные переменные и функции, либо вспомогательные debug-символы). Без компоновщика мы бы не могли делать раздельную компиляцию. Много обьектных файлов не нужно перекомпилировать с самого начала, если в них нету изменений и пересборка идет только в файлах с изменениями(прим. open office, linux kernel).
ELF – Executable and Linkable Format. Эти файлы можно разделить на три категории:
- Relocatable files – .o (то что получается после компиляции) является элементом static libraries (.a), т.е. может включать 1 или больше.
- Executable – программы после этапа линковки, готовые к запуску.
- Shared – .so dynamic libraries, они должны быть скомпонованы с запускаемым файлом в run-time.
Релокация – это процесс подстановки символу его адреса.
Static linker превращает первую категорию во вторую или третью.
Dynamic linker подготавливает третью к выполнению.
Инструменты для анализа бинарных файлов
Список таких инструментов включает:
- readelf – получение специфичной для формата ELF информации.
- objdump – дизассемблер, позволяет исследовать обьектные файлы разных форматов.
- nm – просмотр символов, которые есть в ELF -файле.
В набор GNU Binutils также входят elfedit, elfdump и др., но в данном контексте они не понадобятся.
Структура ELF , содержимое секций
ELF -файл содержит 3 заголовка – File Header, Program Header, и Section Header.
Заголовок ELF -файла содержит magic number 7f 45 4c 46 ( 7f + ascii коды букв ELF ) и указатели на Program Header и Section Header.
Program Header формируется при помощи компоновщика и содержит
информацию о сегментах. Сегменты – это регионы памяти, которые содержат некоторое количество секций.
Section Header содержит информацию про секции .text .data .bss .rodata и множество служебных секций .symtab .line .strtab .debug .got .got.plt. Он необходим для линковки.

Релокации, GOT , PLT
Когда линкер создает разделяемую библиотеку, он заранее не знает, в каком месте в памяти она будет загружена. Из-за этого делать ссылки на данные и код внутри библиотеки проблематично: непонятно, как создавать ссылку, чтобы она указывала в правильное место после того, как библиотека будет загружена.
В Linux и в ELF существует два главных способа решить эту проблему:
- релокация во время загрузки (load-time relocation);
- код, не зависящий от адреса (position-independent code, PIC ).
Релокация во время загрузки – это очень простой и прямолинейный метод. И он работает. Но PIC гораздо более популярен на данный момент и является рекомендуемым способом создания разделяемых библиотек.
У load-time relocation есть проблемы: она занимает время, и секция text (содержащая машинный код) уже не подходит для разделения между процессами.
Поэтому существует такая модель, как Global Offset Table.
GOT – это просто таблица с адресами, которая находится в секции data.
Предположим, что какая-то инструкция в секции code хочет обратиться к переменной. Вместо того, чтобы обратится к ней через абсолютный адрес (который потребует релокации), она обращается к записи в GOT . Поскольку GOT имеет строго определённое место в секции data, и линкер знает о нём, это обращение тоже является относительным. А запись в GOT уже содержит абсолютный адрес переменной:

Однако суть разделяемых библиотек на сегодняшний день в том, что в них может содержаться 10 000 различных функций, но использовать оттуда мы, например, будем лишь № 1 или № 4. Чтобы каждый раз подгружать абсолютно все функции в GOT , мы используем процедуру “ленивого связывания”, т.е. связывание функции из библиотеки с программой происходит при непосредственном вызове её. Помогает в этом механизм Procedure Linkage Table ( PLT ).
PLT – это часть секции text в бинарнике, состоящая из набора элементов (один элемент на одну внешнюю функцию, которую вызывает библиотека). Каждый элемент в PLT – это небольшой кусок выполняемого машинного кода. Вместо вызова функции напрямую вызывается кусок кода из PLT , который уже сам вызывает функцию. Такой подход часто называют «трамплином». Каждый элемент из PLT имеет собственный элемент в GOT , который содержит реальное смещение для функции (конечно после того как загрузчик определит её).

В коде вызывается функция func. Компилятор переводит этот вызов в вызов func@plt, который является одним из элементов PLT . После этого идет обращение в GOT , и с учетом того что функция вызывалась в первый раз – управление передаётся обратно PLT , где т. н. resolver устанавливает связь между названием функции и её кодом из библиотеки. После такого первого связывания схема будет выглядеть немного по-другому:

Библиотека при этом абсолютно не зависит от адреса, по которому она будет загружена: ведь единственное место, где используется абсолютный адрес – это GOT , а она находится в секции data и будет релоцирована загрузчиком во время загрузки. Даже PLT не зависит от адреса загрузки, так что она может находиться в секции text, доступной только для чтения.
Эксперимент с перенаправлением обращений к функциям из библиотек
Наглядно продемонстрировать описанные процессы можно в ходе эксперимента с использованием предварительно написанной демонстрационной программы, функциональность которой должна включать:
- создание паттерна “Proxy” для вызова функций (которые, в свою очередь, используют системные функции) из заранее откопилированных (пользовательских) библиотек без их прямого изменения;
- перенаправление их вызовов в свой интерфейс, для дальнейшего вызова тех самых системных функций из пользовательских библиотек.
Abstract licensed under Attribution 4.0 International (CC BY 4.0) license
Формат файлов ELF
В современных POSIX-системах основным форматом исполняемых файлов, объектных файлов, динамических библиотек является формат ELF. Этот формат используется и на 32-битных (Elf32), и на 64-битных (Elf64) системах и для машин с порядком байт Little-endian, и для машин с порядком байт Big-endian. Далее приведено краткое описание формата Elf32. Формат Elf64 отличается размерами полей, содержащих виртуальные адреса, размеры и смещения в файле.
В описании формата будут использоваться типы данных [u]intN_t, где u является признаком беззнаковости, а N определяет размер типа, например, uint16_t. Эти типы определены в стандартном заголовочном файле stdint.h.
#include
Все типы данных и константы описаны в заголовочном файле elf.h.
Заголовок файла
В начале файла (со смещения 0 от начала) идет заголовок ELF-файла, описываемый следующей структурой:
typedef struct < unsigned char e_ident[16]; uint16_t e_type; uint16_t e_machine; uint32_t e_version; uint32_t e_entry; uint32_t e_phoff; uint32_t e_shoff; uint32_t e_flags; uint16_t e_ehsize; uint16_t e_phentsize; uint16_t e_phnum; uint16_t e_shentsize; uint16_t e_shnum; uint16_t e_shstrndx; >Elf32_Ehdr;
Структура определена таким образом, что поля структуры выровнены по естественным для данной архитектуры правилам выравнивания (то есть 16-битные поля располагаются по четным адресам, а 32-битные — по адресам кратным 4), а полный размер структуры кратен 4 байтам. 16- и 32-битные значения представлены в порядке байт, естественном для соответствующей архитектуры.
Поле e_ident содержит идентификационную информацию о файле. Поле представляет собой массив байт для того, чтобы иметь одинаковое представление на архитектурах с разным размером слова и разным порядком байт в слове. Элементы массива имеют следующее назначение:
| Элемент | Значение | Описание |
|---|---|---|
| e_ident[0] | ‘\x7f’ | «Магическое» значение |
| e_ident[1] | ‘E’ | «Магическое» значение |
| e_ident[2] | ‘L’ | «Магическое» значение |
| e_ident[3] | ‘F’ | «Магическое» значение |
| e_ident[4] | 1 | Размер слова: 0 — неизвестно, 1 — 32, 2 — 64 |
| e_ident[5] | 1 | Порядок байт: 0 — неизвестно, 1 — little-endian, 2 — big-endian |
| e_ident[6] | 1 | Версия формата ELF: 0 — неизвестно, 1 — текущая версия |
| e_ident[7] | 0 | ОС и бинарный интерфейс, для Linux — 0 |
| e_ident[8] | 0 | Версия бинарного интерфейса, для Linux — 0 |
| e_ident[9] - e_ident[15] | 0 | Зарезервировано |
В дальнейшем будут приводиться значения констант для ОС Linux на архитектуре i386. За значениями констант для других операционных систем или архитектур обращайтесь к документации.
Поле e_type идентифицирует тип файла: 0 (неизвестно), 1 (объектный файл), 2 (исполняемый файл), 3 (разделяемая библиотека), 4 (core-файл).
Поле e_machine идентифицирует тип процессора: 0 (неизвестно), 3 (Intel 80386 и совместимые).
Поле e_version идентифицирует версию файла: 0 (недопустимая версия), 1 (текущая версия).
Поле e_entry определяет виртуальный адрес точки входа в программу. После загрузки программы в память управление передается на этот адрес.
Поле e_phoff задает смещение от начала файла до начала таблицы заголовков программы (program header table). Информация о таблице заголовков программы будет дана ниже.
Поле e_shoff задает смещение от начала файла до начала таблицы заголовков секций (program section table). Информация о таблице заголовков секций будет дана ниже.
Поле e_flags задает дополнительные процессорно-специфичные флаги. В настоящее время значение данного поля должно всегда быть 0.
Поле e_ehsize хранит размер заголовка ELF-файла. Его значение должно быть равно 52 (sizeof(Elf32_Ehdr)).
Поле e_phentsize хранит размер одной записи в таблице заголовков программы. Его значение должно быть 32 (sizeof(Elf32_Phdr)) или 0, если таблица заголовков программы пуста.
Поле e_phnum хранит количество записей в таблице заголовков программы.
Поле e_shentsize хранит размер одной записи в таблице заголовков секций. Его значение должно быть равно 40 (sizeof(Elf32_Shdr)) или 0, если таблица заголовков секций пуста.
Поле e_shnum хранит количество записей в таблице заголовков секций.
Поле e_shstrndx хранит индекс заголовка секции, которая хранит имена всех секций (см. ниже).
Таблица заголовков секций
Информация, хранящаяся в ELF-файле, организована в секции. Каждая секция имеет свое уникальное имя. Некоторые секции хранят служебную информацию ELF-файла (например, таблицы строк), другие секции хранят отладочную информацию, третьи секции хранят код или данные программы.
Таблица заголовков секций представляет собой массив структур Elf32_Shdr. Количество элементов массива определяется полем e_shnum заголовка ELF-файла. Массив находится по смещению, хранящемуся в поле e_shoff. Элемент массива 0 зарезервирован и не используется для описания секций. Таким образом, описания секций находятся в элементах массива с индексами от 1 и до e_shnum — 1.
Структура Elf32_Shdr определена следующим образом:
typedef struct < uint32_t sh_name; uint32_t sh_type; uint32_t sh_flags; uint32_t sh_addr; uint32_t sh_offset; uint32_t sh_size; uint32_t sh_link; uint32_t sh_info; uint32_t sh_addralign; uint32_t sh_entsize; >Elf32_Shdr;
Поле sh_name хранит индекс имени секции. Индекс имени — это смещение в данных секции, индекс которой задается в поле e_shstrndx заголовка ELF-файла. По этому смещению размещается строка, завершающаяся нулевым байтом, являющаяся именем секции.
Таким образом, чтобы получить имя секции необходимо выполнить следующие действия:
- Загрузить заголовок секции, индекс которой хранится в поле e_shstrndx заголовка ELF-файла.
- Загрузить тело соответствующей секции.
- По смещению, заданному в поле sh_name относительно начала области памяти, в которую загружена секция, находится требуемая строка имени секции.
Поле sh_type хранит тип секции. Возможные значения поля перечислены ниже.
| Значение | Симв. имя | Описание |
|---|---|---|
| 0 | SHT_NULL | Пустой заголовок секции. Значения всех прочих полей заголовка секции неопределены. |
| 1 | SHT_PROGBITS | Секции программы (код или данные или что-либо еще). |
| 2 | SHT_SYMTAB | Таблица символов (для объектных файлов или динамических библиотек). |
| 3 | SHT_STRTAB | Таблица строк. |
| 4 | SHT_RELA | Записи о перемещаемых адресах (relocations). |
| 5 | SHT_HASH | Хеш-таблица имен для динамического связывания. |
| 6 | SHT_DYNAMIC | Информация для динамического связывания. |
| 7 | SHT_NOTE | Произвольная дополнительная информация. |
| 8 | SHT_NOBITS | Секция не занимает место в файле, но занимает место в адресном пространстве процесса. |
| 9 | SHT_REL | Записи о перемещаемых адресах. |
Поле sh_flags хранит битовые флаги, описывающие дополнительные атрибуты.
| Значение | Симв. константа | Описание |
|---|---|---|
| 1 | SHF_WRITE | Содержимое секции должно быть доступно на запись в адресном пространстве процесса. |
| 2 | SHF_ALLOC | Для содержимого секции выделяется память в адресном пространстве процесса. |
| 4 | SHF_EXECINSTR | Секция содержит инструкции процессора. |
Флаги могут комбинироваться с помощью операции побитового или.
Поле sh_addr хранит адрес в виртуальном адресном пространстве процесса в случае, если секция загружается в виртуальное адресное пространство процесса.
Поле sh_offset хранит смещение от начала файла, по которому размещаются данные секции.
Поле sh_size хранит размер секции в байтах.
Поле sh_link хранит индекс другой секции (в некоторых специальных случаях).
Поле sh_info хранит дополнительную информацию о секции.
Поле sh_addralign хранит требование по выравниванию адреса начала секции в памяти. Значения 0 или 1 означают отсутствие требования по выравниванию. В противном случае значением поля должна быть степень 2. Например, секции, загружаемые в виртуальное адресное пространство процесса, как правило, выровнены по размеру страницы процессора (4096).
Поле sh_entsize хранит размер одной записи, если секция хранит таблицу из записей фиксированного размера.
Таблица заголовков программы
Таблица заголовков программы содержит информацию, необходимую для загрузки программы на выполнение.
Таблица заголовков программы представляет собой массив структур Elf32_Phdr. Массив размещается по смещению от начала файла, которое хранится в поле e_phoff заголовка ELF-файла, а количество элементов массива хранится в поле e_phnum заголовка ELF-файла.
Структура Elf32_Phdr определена следующим образом.
typedef struct < uint32_t p_type; Elf32_Off p_offset; Elf32_Addr p_vaddr; Elf32_Addr p_paddr; uint32_t p_filesz; uint32_t p_memsz; uint32_t p_flags; uint32_t p_align; >Elf32_Phdr;
Поле p_type хранит тип заголовка. Некоторые возможные значения типа заголовка приведены в таблице ниже.
| Значение | Симв. константа | Описание |
|---|---|---|
| 0 | PT_NULL | Обозначает не используемую запись |
| 1 | PT_LOAD | Сегмент программы, загружаемый в память |
| 2 | PT_DYNAMIC | Информация для динамического связывания |
| 3 | PT_INTERP | Загрузчик программ |
| 4 | PT_NOTE | Дополнительная информация |
| 6 | PT_PHDR | Информация о самой таблице заголовков программы |
| 7 | PT_TLS | Thread-local storage |
Поле p_offset хранит смещение от начала файла, по которому располагается данный сегмент.
Поле p_vaddr хранит виртуальный адрес начала сегмента в памяти.
Значение поля p_paddr должно быть равно 0.
Поле p_filesz хранит размер сегмента в файле (может быть 0).
Поле p_memsz хранит размер сегмента в памяти (может быть 0).
Поле p_flags хранит флаги доступа к сегменту в памяти (могут объединяться с помощью побитового «или»).
| Значение | Симв. константа | Описание |
|---|---|---|
| 1 | PT_X | Сегмент доступен на выполнение |
| 2 | PT_W | Сегмент доступен на запись |
| 4 | PT_R | Сегмент доступен на чтение |
Сегмент PT_NOTE
В сегменте ELF-файла с типом PT_NOTE хранится дополнительная информация о состоянии выполнения программы. Сегмент сам содержит произвольное количество записей произвольного размера. Сегмент всегда имеет размер, кратный 4 байтам (для Elf32), и каждая запись в сегменте начинается со смещения, кратного 4 байтам. В начале каждой записи находится заголовок записи, описываемый следующей структурой:
typedef struct < Elf32_Word n_namesz; Elf32_Word n_descsz; Elf32_Word n_type; >Elf32_Nhdr;
Поле n_namesz содержит длину названия записи. Название должно быть непустой строкой, завершающейся байтом 0. Сама строка названия записи начинается сразу же после структуры Elf32_Nhdr.
Поле n_descsz содержит длину информационной части записи. Длина должна быть кратна 4 байтам. Информационная часть записи начинается сразу после названия записи с учетом выравнивания по границе 4 байт.
Поле n_type содержит тип записи. Возможные типы записи зависят от типа файла (объектный, core) и рассматриваются в соответствующих разделах.
Ниже приведен пример сегмента PT_NOTE.
| См. от начала | Значение | Комментарий | |||
|---|---|---|---|---|---|
| 0x0000 | 0x07 | 0x00 | 0x00 | 0x00 | n_namesz == 7 |
| 0x0004 | 0x08 | 0x00 | 0x00 | 0x00 | n_descsz == 8 |
| 0x0008 | 0x01 | 0x00 | 0x00 | 0x00 | n_type == 1 |
| 0x000c | ‘G’ | ‘N’ | ‘U’ | ‘D’ | имя записи: «GNUDBG» |
| 0x0010 | ‘B’ | ‘G’ | ‘\0’ | 0x00 | |
| 0x0014 | 0x01 | 0x02 | 0x03 | 0x04 | информация: 0x04030201 0x08070605 |
| 0x0018 | 0x05 | 0x06 | 0x07 | 0x08 | |
core-файлы
core-файл — это ELF-файл, у которого значение поля e_type заголовка равно ET_CORE (4). В core-файле таблица заголовков секций пуста, а таблица заголовков программ состоит из записей типа PT_LOAD, хранящих содержимое адресного пространства процесса на момент завершения работы процесса, и записи типа PT_NOTE, хранящей состояние процесса на момент завершения работы процесса.
Для тестового файла sample.core содержимое таблицы заголовков программ имеет следующий вид.
| p_type | p_flags | p_offset | p_vaddr | p_filesz | p_memsz | p_align |
|---|---|---|---|---|---|---|
| PT_NOTE | — | 0x00000234 | 0x00000000 | 1216 | 0 | 0 |
| PT_LOAD | r-x | 0x00001000 | 0x08048000 | 4096 | 8192 | 4096 |
| PT_LOAD | rw- | 0x00002000 | 0x0804a000 | 4096 | 4096 | 4096 |
| PT_LOAD | rw- | 0x00003000 | 0x08542000 | 135168 | 135168 | 4096 |
| PT_LOAD | r-x | 0x00024000 | 0x4f2d0000 | 4096 | 126976 | 4096 |
| PT_LOAD | r— | 0x00025000 | 0x4f2ef000 | 4096 | 4096 | 4096 |
| PT_LOAD | rw- | 0x00026000 | 0x4f2f0000 | 4096 | 4096 | 4096 |
| PT_LOAD | r-x | 0x00027000 | 0x4f2f7000 | 4096 | 1748992 | 4096 |
| PT_LOAD | — | 0x00028000 | 0x4f4a2000 | 0 | 4096 | 4096 |
| PT_LOAD | r— | 0x00028000 | 0x4f4a3000 | 8192 | 8192 | 4096 |
| PT_LOAD | rw- | 0x0002a000 | 0x4f4a5000 | 4096 | 4096 | 4096 |
| PT_LOAD | rw- | 0x0002b000 | 0x4f4a6000 | 12288 | 12288 | 4096 |
| PT_LOAD | rw- | 0x0002e000 | 0xb778a000 | 4096 | 4096 | 4096 |
| PT_LOAD | rw- | 0x0002f000 | 0xb77a1000 | 8192 | 8192 | 4096 |
| PT_LOAD | r-x | 0x00031000 | 0xb77a3000 | 4096 | 4096 | 4096 |
| PT_LOAD | rw- | 0x00032000 | 0xbfe6d000 | 139264 | 139264 | 4096 |
Первый сегмент (сегмент PT_NOTE) содержит информацию о состоянии процесса на момент создания core-файла.
Для core-файлов возможны следующие значения поля n_type (в таблице ниже перечислены не все возможные значения).
| Значение | Симв. константа | Описание |
|---|---|---|
| 1 | NT_PRSTATUS | Информационная часть записи имеет тип prstatus_t |
| 2 | NT_FPREGSET | Информационная часть записи имеет тип prfpregset_t |
| 3 | NT_PRPSINFO | Информационная часть записи имеет тип prpsinfo_t |
Типы структур, используемые в информационных частях записей, определены в заголовочном файле
#include
Структура prstatus_t определена следующим образом:
typedef struct elf_prstatus < struct elf_siginfo pr_info; // информация о сигналах short int pr_cursig; // текущий сигнал unsigned long int pr_sigpend; // множество сигналов, ожидающих доставки unsigned long int pr_sighold; // множество удерживаемых сигналов pid_t pr_pid; // pid процесса pid_t pr_ppid; // pid родителя pid_t pr_pgrp; // группа процессов pid_t pr_sid; // идентификатор сессии struct timeval pr_utime; // пользовательское время struct timeval pr_stime; // системное время struct timeval pr_cutime; // накопленное пользовательское время struct timeval pr_cstime; // накопленное системное время elf_gregset_t pr_reg; // регистры общего назначения int pr_fpvalid; // true, если использовались регистры FPU >prstatus_t;
Тип elf_gregset_t определен следующим образом:
typedef unsigned long elf_gregset_t[ELF_NGREG];
то есть представляет собой массив, в котором каждый регистр общего назначения находится по определенному индексу.
| индекс | регистр |
|---|---|
| 0 | ebx |
| 1 | ecx |
| 2 | edx |
| 3 | esi |
| 4 | edi |
| 5 | ebp |
| 6 | eax |
| 7 | ds |
| 8 | es |
| 9 | fs |
| 10 | gs |
| 11 | orig_eax |
| 12 | eip |
| 13 | cs |
| 14 | eflags |
| 15 | sp |
| 16 | ss |
Формат отладочной информации stabs
При компиляции в исполняемый файл может добавляться отладочная информация, которую отладчик использует для отображения хода исполнения программы в терминах языка высокого уровня. Существует несколько форматов отладочной информации (STABS, DWARF), здесь описывается формат STABS как самый простой.
Для компиляции программы с добавлением отладочной информации в формате STABS используется опция gcc -gstabs, например
gcc -gstabs -std=gnu11 sample.c -o sample
В формате STABS отладочная информация хранится в секциях .stab и .stabstr ELF-файла.
Секция .stab содержит массив структур:
struct Stab < uint32_t n_strx; // позиция начала строки в секции .strstab uint8_t n_type; // тип отладочного символа uint8_t n_other; // прочая информация uint16_t n_desc; // описание отладочного символа uintptr_t n_value; // значение отладочного символа >;
Секция .stabstr хранит символьные строки, завершающиеся байтом 0, которые используются в записях в секции .stab.
Поле n_type хранит тип записи. Возможные типы записей можно найти в stab.h, нас будут интересовать только некоторые из них.
| Симв. имя | Значение | Описание |
|---|---|---|
| N_SO | 0x64 | Информация о единице компиляции: n_desc — язык исходного кода n_strx — индекс в секции .stabstr строки имени основного файла единицы компиляции n_value — адрес первой инструкции |
| N_SOL | 0x84 | Имя файла, устанавливаемое с помощью директивы #line или имя файла, включаемого с помощью #include n_strx — индекс в секции .stabstr строки имени файла Будем предполагать, что действие имени файла, устанавливаемого в записи N_SOL, начинается со следующей записи. |
| N_FUN | 0x24 | Имя функции n_value — адрес первой инструкции функции n_strx — индекс в секции .stabstr строки имени функции Имя состоит непосредственно из названия и после ‘:’ следуют типы параметров, если таковые есть |
| N_SLINE | 0x44 | Номер строки исполняемого кода n_value — смещение первой инструкции строки относительно начала функции n_desc — номер строки в исходном тексте |
Каждой единице компиляции соответствуют две записи N_SO. Первая запись находится в начале описания единицы компиляции и содержит ее имя в поле n_strx и адрес первой инструкции в поле n_value. Вторая запись находится в конце описания единицы компиляции и содержит нулевое значение (пустая строка) в поле n_strx и адрес непосредственно следующий за концом кода данной единицы компиляции в поле n_value.
Записи N_SLINE упорядочены по смещениям внутри функции.
Первая запись в таблице .stab является служебной и имеет тип N_UNDF. Индекс этой записи полагается равным 0.
Формат STABS не позволяет однозначно установить адрес, на котором заканчивается тело функции. Можно использовать следующую эвристику: функция заканчивается либо с началом следующей функции, тогда адрес конца функции — это адрес начала следующей функции, либо с концом единицы компиляции, тогда адрес конца функции — это адрес, хранящийся в поле n_value записи N_SO в конце единицы компиляции.
Как обычно, предполагается, что все диапазоны адресов и значений включают в себя нижнее значение, но не включают в себя верхнее значение, то есть имеют вид [low;high).
Имя файла, в котором располагается функция, может находиться в записи N_SOL после записи N_FUN самой функции, но до первой записи N_SLINE. Следует полагать, что имя файла, в котором определена функция совпадает с именем файла, установленному до первой записи N_SLINE в данной функции.
Пример: файл file1.h:i
#include void func2(int val)
#include «file1.h» int val; int func1(void) < scanf("%d", &val); return val; >int main()
SO 0 2 08048430 1 file1.c FUN 0 0 08048430 3880 func2:F(0,18) . SOL 0 0 08048430 668 file1.h SLINE 0 3 00000000 0 SLINE 0 4 00000006 0 SLINE 0 5 00000019 0 FUN 0 0 0804844b 3905 func1:F(0,1) SOL 0 0 0804844b 1 file1.c SLINE 0 4 00000000 0 SLINE 0 5 00000006 0 SLINE 0 6 0000001a 0 SLINE 0 7 0000001f 0 FUN 0 0 0804846c 3918 main:F(0,1) SLINE 0 10 00000000 0 SLINE 0 11 00000009 0 SLINE 0 12 0000000e 0 SLINE 0 13 0000001b 0 SLINE 0 14 00000020 0 SO 0 0 0804848e 0
Русский [ править ]
Происходит от прагерм. формы *albiz , от которой в числе прочего произошли: др.-англ. elf, ælf и англ. elf, начальная часть в герм. именах типа Альфред, Эльфрик и т. п. Предположит. восходит к праиндоевр. *albho- «белый».
Фразеологизмы и устойчивые сочетания [ править ]
Перевод [ править ]
эльф II [ править ]
Морфологические и синтаксические свойства [ править ]
| падеж | ед. ч. | мн. ч. |
|---|---|---|
| Им. | эльф | э́льфы |
| Р. | э́льфа | э́льфов |
| Д. | э́льфу | э́льфам |
| В. | эльф | э́льфы |
| Тв. | э́льфом | э́льфами |
| Пр. | э́льфе | э́льфах |
Произношение [ править ]
- МФА: ед. ч. [ ɛlʲf ], мн. ч. [ ˈɛlʲfɨ ]
Семантические свойства [ править ]
Значение [ править ]
- метеорол. вид электрических разрядов в верхних слоях атмосферы, подобие молнии, представляющие собой огромные, но слабосветящиеся вспышки-конусы диаметром около 400 км, которые появляются непосредственно из верхней части грозового облака ◆ Отсутствует пример употребления (см. рекомендации ).
Синонимы [ править ]
Антонимы [ править ]
Гиперонимы [ править ]
Гипонимы [ править ]
Родственные слова [ править ]
| Ближайшее родство |
Этимология [ править ]
Из англ. elve , сокр. от Emission of Light and Very Low Frequency perturbations due to Electromagnetic Pulse Sources — «излучение света и очень низкочастотные возмущения из-за импульса от электромагнитного источника».
Фразеологизмы и устойчивые сочетания [ править ]
Перевод [ править ]
Библиография [ править ]
- Русский язык
- Омонимы/ru
- Статьи с 2 омонимами/ru
- Русские лексемы
- Русские существительные
- Одушевлённые/ru
- Мужской род/ru
- Русские существительные, склонение 1a
- Русские слова, тип морфемного строения R
- Мифологические термины/ru
- Фантастические термины/ru
- Неодушевлённые/ru
- Метеорологические термины/ru
- Слова английского происхождения/ru
- Мифические существа/ru
- Персонажи/ru
- Атмосферные явления/ru
- Слова из 4 букв/ru
- Статьи со ссылками на Википедию/ru
- Статьи со ссылками на Лексемы Викиданных
- Нужна аудиозапись произношения/ru
- Статьи без примеров употребления
- Статьи, нуждающиеся в доработке/ru
- Нужны сведения о семантике/ru
Эльф

Эльфы (нем. elf — от alb — белый) — волшебный народ в германо-скандинавском и кельтском фольклоре. Известны также под названиями альвы (швед.), ши (sidhe (ирл.) — читается как «ши»)или аульвы(скандинавское). Описания эльфов в различных мифологиях различаются, но как правило это красивые, светлые существа, духи леса, дружественные человеку. Во многих произведениях нет фактических различий между эльфами и феями.
В фэнтези-литературе эльфы являются, наряду с гномами, гоблинами и троллями, одной из «стандартных» рас.
Этимология
В германских языках есть группа подобных «elf» слов: датское название «elv», англо-саксонское «aelf», шведское «alv», норвежское «alv» и исландское «alf-ur», что говорит о едином корне, а следовательно — о былом единстве представлений об эльфах среди предков всех современных германских народов. Само же происхождение германского слова «эльф» понять намного сложнее, да и вряд ли возможно вообще. Некоторые исследователи связывают это слово с романским корнем «альб» — «белый», есть также мнение, что оно произошло от валлийского или шотландского «ellyl»/«aillil» — «сияющий», восходя к шумерскому «ellu» — тоже «сияющий» (эльфов из ранних легенд отличало исходящее от них сияние, в качестве примера см. англо-саксонское слово «aelf-sciene»).
Альвы в Эддах
А́львы — по сути то же слово «эльфы», только в произношении некоторых германо-скандинавских языков.
Светлые альвы: Beyla, Byggvir, Dokkalfar, Вёлунд
Дварфы и цверги: Berling, Litr, Альвис, Альфрик, Андвари, Берлинг, Бил, Брок, Видфин, Галяр, Грэр, Гендальф, Двалин, Дьюрин, Ловар, Нии, Ниди, Отр, Регин, Синдри, Фафнир, Фйаляр, Хрейдмар, Хьюки, Эйтри,
Ветры: Аустри, Вестри, Нордри, Судри
В «Старшей Эдде» противопоставляются высшим богам — асам. В германской мифологии происхождение эльфов тесно связывается с историей всего мироздания и различаются два главные «разряда» эльфов: альфы — белые, светлые, добрые эльфы, и дверги — мрачные и угрюмые, хитрые карлики (скорее всего это просто другое название гномов). Впрочем, возможно именно альвы делятся на светлых и темных, а темные и называются цвергами. Эта разница получилась из-за самого слова «альвы», очевидно, именно от него потом появилось слово «эльфы». Согласно «Младшей Эдде» альвы и дверги зародились в мясе Имира, как черви, но по воле богов восприняли в себя часть человеческого разума и наружный вид людей. Однако «Старшая Эдда» рассказывает о появлении цвергов несколько иначе. Там говорится, что боги создали двух карликов «из крови Бримира, из кости Блаина», а остальных вылепили из глины. Хотя, в этом нет ничего удивительного, если вспомнить, что Бримир и Блаин — просто другие имена Имира.
Альвы — духи природы. Они живут в своей стране Альвхейме. Обликом своим они прекраснее солнца. Правит альвами бог-кузнец Велунд. Они являются «светлыми эльфами».
Дверги, или цверги — подземные карлики, искусные кузнецы. Они живут под землей и боятся света, лучи солнца превращают их в камень. Они не велики ростом, но очень сильны. Об их облике мало что известно, кроме того, что они маленького роста и предвещают беду. По некоторым источникам, у двергов на ногах по семь пальцев. Они похищают скот и детей, а также горазды на мелкие пакости. Они являются «темными эльфами». От них произошли столь популярные в современной англоязычной литературе гномы. Им доверили недра земли, потому почти везде двергов стали считать искуснейшими кузнецами, которые способны ковать самую гибкую и твердую сталь либо выделывать из золота и серебра такие мелкие вещи, которые едва сможет различить человеческий глаз. В средние века твердо верили в происхождение хороших мечей и кольчуг от карликов. Много существует разных преданий о том, как они дарили людям произведениями своих кузниц. Такие подарки всегда обладали какими-нибудь особенными свойствами. Но беда, если подарки эти бывали вынужденными: карлики, в отмщенье, всегда умели наделять их такими свойствами, что получивший их в целую жизнь свою не мог себе простить насилия, сделанного хитрому кузнецу-волшебнику.
Вот древняя германо-скандинавская легенда о таких хитроумных и мстительных карликах-двергах.
«Суафарлами, один из потомков Одина, был однажды на охоте. Долго бродил он по лесу и не мог попасть на след какого-нибудь зверя; наконец зашел он в такую глушь, из которой не знал как и выбраться. Направо от него был холм. Взглянув на него, Суафарлами увидел сидевших перед холмом двух карликов; тогда, выхватив свой тяжелый меч, он стал между ними и холмом и загородил им таким образом дорогу домой.
Карлики взмолились о пощаде, предлагая ему за свою жизнь и свободу какой угодно выкуп. Суафарлами отпустил их только под тем условием, чтобы они выковали ему меч, который бы не давал никогда промаха, разрубал бы сталь и железо, как щепку, никогда не ржавел и постоянно приносил в битвах и поединках победу тому, в чьих руках находится. Карлики обещали выковать такой меч и назначили день, в который Суафарлами должен был прийти за ним. Когда он явился в назначенный день, карлики вынесли ему из холма чудный волшебный меч в серебряных ножнах, с золотой рукояткой и цепью, на которой надо было его привешивать. — Вот тебе обещанное, — сказали они Суафарлами, — но знай, что этот меч убьет человека каждый раз, как будет обнажен, что через него совершены будут три постыднейших братоубийства, и ты сам будешь им убит. И все так точно сбылось, как предсказывали карлики. Как только он вынул меч чтобы взглянуть на него, то тот вонзился брату в грудь, который так же наклонился посмотреть его. А потом в очередной раз вынув меч Суафарлами споткнулся и упал на него, сам себя зарезав».
Кельты считают цвергов фальшивомонетчиками, уверяют, что волшебный мешочек, который всегда привязан к их поясу, постоянно полон червонцами, и уж если кому удастся овладеть таким сокровищем, тот до конца дней своих будет богат.
Туаты у кельтов
Основная статья: племена богини Дану
Во времена глубокой древности в Ирландии появились туата де Даннан (племена богини Дану или дети Дану). Своим колдовством они укрыли землю густыми туманами и безраздельно властвовали островом, сражаясь с другими племенами и демонами-фоморами приплывшими из-за моря.
Впоследствии туата де Даннан уступили власть над Ирландией милезам (сыновьям Миля). Милезы заключили с туатами договор, по которому милезы получают остров во владение, а дети Дану могут остаться в Ирландии, но жить не на поверхности земли, а внутри холмов, именуемых сидами. Отсюда и новое название туатов — сиды (Sídhe) или ши (Shee).
Частица «ши» в названиях сверхъестественных существ почти всегда указывает на то, что это существо из германской или кельтской мифологии. Например: бааван ши; баньши; дини ши; кайт ши; шифра и т. д.
Образ сидов почти полностью совпадает с современными представлениями об эльфах, возникшими благодаря современной и классической литературе.
Сиды высоки ростом и прекрасны лицом. Однако одного их прикосновения достаточно, чтобы свести человека с ума; стрелы сидов, с пропитанными ядом наконечниками, убивают на месте. Правит сидами королева Медб — красавица с голубыми глазами и длинными белокурыми волосами. Тот, кому доведется увидеть её, умрет от любви и тоски. Если сидам не докучать, они не обратят на людей не малейшего внимания. У них своя жизнь, свои заботы — они пасут свой чудесный скот, танцуют, попивают виски, музицируют. Особенно остерегаться сидов следует в Хеллоуин (31 октября) — древний языческий праздник у кельтов, начало нового года. Считается, что в это время сиды переселяются из одних холмов в другие. Именно сиды часто соблазняют и увлекают за собой смертных мужчин (рыцарей, воинов или принцев). В ирландской саге «Исчезновение Кондлы Прекрасного, сына Конда Ста Битв» рассказывается, что девушка из сидов долго соблазняла одного юношу. Она говорила ему:
«—Я пришла из страны живых, из страны, где нет ни смерти, ни невзгод. Там у нас длится беспрерывный пир, которого не надо готовить. В большом сиде обитаем мы, и потому племенем сидов зовемся мы.
Пойдем со мной, мой возлюбленный. Золотой венец покроет твой пурпурный лик, Чтоб почтить твой царственный облик. Пожелай лишь — и никогда не увянут Ни юность, ни красота твоих черт, Пленительных до скончания века». Дважды друидам удавалось рассеять чары сидов, но на третий раз, когда девушка спела: «Давно влечет тебя сладкое желание, Со мной за волну унестись ты хочешь. Если войдешь в мою стеклянную ладью, Мы достигнем царства Победоносного. Есть иная страна, далекая, Мила она тому, кто отыщет её. Хоть, вижу я, садится уж солнце. Мы её, далекой, достигнем до ночи».
Юноша прыгнул в стеклянную ладью и уплыл вместе с девушкой, и больше его среди людей не встречали.
Эльфы в английском фольклоре
Англичане, в отличие от жителей Скандинавского полуострова и Германии, не разделяют эльфов на «светлых» и «тёмных». Эльфы видятся англичанам скорее в образе фейри — не злых но и не добрых существ, со своими странностями, пристрастиями и пороками.
В некоторых графствах Англии люди верят в более или менее добрых, хотя и озорных эльфов. В других же — в жестоких, злых и уродливых человечков, так же называющихся эльфами. Чаще всего их обозначают одним словом — пикси (pixie).
У эльфов есть один особенно неприятный порок: это их страсть к воровству. Еще пускай бы забавлялись они тем, что обирали бы поля с горохом да опорожняли бочки с пивом, либо, забравшись в погреб, вытягивали через соломинку дорогие старые вина!
Но нет — они не довольствуются этим, их воровство принимает обыкновенно гораздо более важный и вредный характер: они постоянно стараются уводить в холмы невест тотчас после венца и уносить новорожденных детей до крещения. На место похищенных малюток кладут они в колыбели каких-то своих уродцев, которые мучают всех окружающих несносным криком, злостью и капризами.
Эти черты характера эльфов особенно возбуждали против них негодование людей, и много существует разных легенд о подобных проделках жителей холмов. Все подобные легенды, равно как и поверья, послужившие им основанием, очень древние и так сильно укоренились, что до сих пор поселяне в Швеции и Германии очень неприязненно смотрят на хромых, горбатых и болезненных детей, называя их обыкновенно подкидышами эльфов.
Вот несколько типично английских сказок об эльфах:
«У одной матери эльфы унесли ребенка; по крайней мере, она не могла иначе, как подкидыванием, объяснить себе то, что её здоровый, краснощекий малютка в одну ночь побледнел, похудел и изменился в лице и в характере: прежде тихий и ласковый, он теперь постоянно плакал, кричал и капризничал. Бедная мать стала просить помощи у разных умных и опытных людей. Одни советовали ей прямо выбросить ребенка в глубокий снег, другие — схватить его за нос калеными щипцами, третьи — оставить его на ночь при большой дороге, чтобы тем возбудить в эльфах сострадание к их собрату, а, следовательно, и принудить к возвращению настоящего малютки.
Мать решительно не могла согласиться с ними, потому что её тревожила мысль: „А что если это не подкидыш, а действительно мой ребенок, только испорченный чьим-нибудь дурным глазом?“
Наконец, одна старушка над ней сжалилась и сказала:
— Прежде всего нужно узнать наверное, подкидыш ли это или нет. А чтобы это узнать, возьми ты полдесятка яиц, разбей их скорлупу на половинки, положи перед ребенком на очаг и налей в них воды. Что из этого выйдет, сама увидишь. Только смотри, приготовь заранее каленые щипцы, чтобы хорошенько пугнуть эльфа, если ребенок окажется подкидышем.
Мать приняла совет старухи и тотчас по приходе домой, положила в печь щипцы калиться и стала разбивать яйца перед очагом. Увидев это, ребенок вдруг приподнялся, смолк и стал внимательно глядеть на мать.
Когда же она разложила на очаге яичные скорлупки и налила их водой, ребенок вдруг обратился к ней и сказал (хотя двухмесячные дети не говорят вообще ни слова):
— Что это ты, мать, делаешь?
Мать невольно вздрогнула, услышав это, но отвечала как можно равнодушнее:
— Ты, я думаю, сам видишь, что я делаю: воду кипячу.
— Как? — продолжал мнимый ребенок с возрастающим удивлением. — В яичных скорлупах кипятишь воду?
— Ну, да, — отвечала мать, заглядывая в печь, чтобы видеть, готовы ли щипцы.
— Да помилуй, — закричал эльф, всплеснув руками, — я вот уже 1500 лет живу на свете, а никогда еще ничего подобного не видывал!
Тут мать выхватила из печки раскалившиеся докрасна щипцы и с яростью бросилась на подкидыша, но тот быстро выскочил из колыбели, прыгнул к печке и вылетел в трубу.
Когда же мать подбежала к колыбели с раскаленными щипцами, они у неё вдруг выпали из рук: в постельке, на месте безобразного эльфа, лежал её драгоценный малютка, подложив одну ручонку под голову, а другую крепко прижимая к своей грудке, которая слегка подымалась легкими и мерным дыханием. Кто передаст радость матери?»
«Жили-были муж да жена. Эльфы унесли у них ребенка, которого крестины были замедлены какими-то домашними хлопотами, и подсунули им вместо него своего собственного ребенка (подкидыша). Этот безобразный, худой и, по-видимому, хилый ребенок страшно мучил и отца, и мать; пока кто-нибудь был в комнате, он целый день ревел и метался в люльке, а чуть только все из комнаты выходили, как он выскакивал из люльки на пол, начинал карабкаться на стены, подпрыгивать и приплясывать: ел он за четверых и никогда, кажется, не бывал сыт.
Родители вскоре порешили, что это непременно должен быть подкидыш, и положили от него избавиться во что бы то ни стало. По совету опытной знахарки, мать вот как принялась за дело. Взяла поросенка, зарезала его и запекла в пудинг вместе со щетиной, шкурой, копытами и головой.
Когда мнимый ребенок попросил у неё есть, она тотчас же подала ему это странное кушанье. Тот принялся за него со своей обычной жадностью, но, пожевав несколько минут, призадумался, с изумлением поглядел на пудинг и вдруг заговорил:
— Вот странность! Подают мне кушанье со шкурой и щетиной, с копытами, с глазами! Ха! Ха! Ха! Да я уж сколько живу на свете! Уже ведь три раза видел, как вырастал молодой лес, но о таких кушаньях и не слыхивал!
При этом он выскочил из люльки и исчез; а эльфы вернули догадливым родителям их настоящего ребенка».
В Англии называли «локоном эльфа» клок спутавшихся волос, считая, что это проказа эльфов. В одном англосаксонском заговоре, относящемся, по всем данным, к эпохе язычества, им приписывают коварную привычку метать издали крошечные железные стрелы, которые пронзают кожу, не оставив следа, и причиняют внезапные мучительные колики.
В Ирландии верят и в «больших», человекоподобных эльфов, которых там называют Туата Де Дананн (по другим источникам так называется один из высших классов фейри) или сидов, а так же и в маленьких крылатых эльфов-фей (как и англичане, ирландцы называют их fairy — под тем же словом они подразумевают и фей).
Эльфы в датском фольклоре
В Дании под словом «эльфы» подразумеваются существа, легенды о которых широко распространены по всей северной Европе; их называют скоге, или лесными духами или элле. Описания их схожи — мужчины похожи на стариков в широкополых шляпах, а женщины молодые и прекрасные, однако под зелеными платьями они прячут бычьи хвосты (как и мужчины-элле), а если случайно увидеть женщину-элле сзади, можно увидеть что спина и затылок у неё — полые.
Эльфы в шведском фольклоре
Хотя легенды об эльфах не слишком распространены в Швеции, их фольклор включает в себя большое количество рассказов и легенд о фейри и всевозможных мистических существах, обитающих в лесу. Считается, что лесные духи, упоминаемые в старинных шведских преданиях, это лесные эльфы или по-другому — лесной народ.
Во времена язычества люди верили, что в особенно раскидистых и мощных деревьях обитает лесной эльф. Ореол святости вокруг языческих рощ и деревьев берет начало от древнего обычая совершать жертвоприношения на деревьях. Возможно, сама идея обитаемых деревьев была заимствована из греко-римской культуры.
В Швеции, как и во всех странах северной Европы есть сказание о волшебных существах, с полыми спинами, обитающими в лесах. Шведы называют их скоге. Скоге, скорее всего, не относятся к числу злых духов, но люди предпочитали с ними не встречаться; для чего и брали с собой в лес металлические предметы. Версия о том, что сверхъестественные существа боятся железа так же широко распространена в Европе.
В Швеции до сих пор можно увидеть так называемые эльфийские алтари (elf-altars), на которых во времена язычества совершались обряды и жертвоприношения. Некоторые эти обряды проводились и после принятия христианства.
Часто встречаются истории о «ведьминых кольцах»: считается, что в этих местах эльфы или лесные духи по ночам водят хороводы. Существует много легенд у разных народов (чаще всего шотландцев, шведов и ирландцев) о том как эльфы предлагали смертным (чаще всего рыцарям) вступить в их хоровод и принять участие в танце. При этом, если человек отказывался, мстительные эльфы насылали на него страшные болезни и несчастья. А если соглашался, то на утро, когда магия эльфов рассеивалась, человека находили мертвым в центре ведьмина круга. Роджер Желязны в своем эпическом романе «Хроники Амбера» использовал и адаптировал древний кельтский миф о ведьмином кольце: «Мне говорили, что это случилось далеко на западе — появился небольшой круг из поганок. Внутри его нашли мертвую девочку. Место объявили проклятым. Круг стал быстро расти и через несколько месяцев уже был в целую лигу. Внутри кольца трава потемнела и стала блестящей, как металл, но не погибла. Деревья скрючились, их листья померкли. Они гремели, даже если не было ветра, и летучие мыши плясали и метались меж ними. В сумерках там бродили странные тени — но всегда внутри Круга, и какие-то огоньки, словно небольшие костры, горели там по ночам». Интересно, что в некоторых шведских преданиях эльфов разделяют на три группы, принадлежащие, соответственно, стихиям земли, воздуха и воды. Лесных эльфов в этом случае относят к стихии земли. Так же в Швеции распространены сказания о горном народце. Об этих существах известно мало (несмотря на обилие сказок и историй): горным народцем называют и эльфов, и гномов и даже иногда троллей; точно так же, как и Норвегии.
Эльфы в норвежском фольклоре
В Норвегии широко распространены легенды и сказки о всевозможных низших мифических существах, называемых одним словом — туссеры. Под этим названием могут подразумеваться эльфы, гномы, веттиры (подземный народец, другое название гномов), ульдра (красивые женщины с лентами в волосах, но обладающие так же коровьим хвостом, который они скрывают от людей), тролли или даже ниссе (аналог домовых, с той только разницей, что живут не в домах людей, а по близости в лесу). Особенность норвежского представления об этом сверхъестественном народе в том что, согласно их поверьям, туссеры строят дома и церкви, пасут скот и живут селениями.
Эльфы в искусстве
Эльфы глубоко укоренены в европейской традиции. Эльфы присутствуют в произведениях лорда Дансени и Джона Рональда Руэла Толкина. Интересен образ эльфов у Шекспира Эльфы часто составляют свиту Санта Клауса. Также об эльфах упоминается у Гете («Фауст»).
Тёмные эльфы
В скандинавской мифологии существовали два типа альвов: верхние (светлые) и нижние (тёмные, или свартальвы), причем последним в «Эддах» уделяется значительно больше внимания. Это существа, живущие под землей и обладающие смуглой кожей. Они неоднократно создавали для богов волшебные вещи. В позднем фольклоре этот образ слился с гномами.
В фэнтези-литературе тёмные эльфы получили «второе рождение». Толкин в «Сильмариллионе» описал орков как злой антипод эльфов, их извращенный злом вариант, с чёрной кожей и страхом перед солнцем. Понятие «тёмные эльфы» («мориквенди») у Толкина, однако, применяется не к ним, а к племени эльфов, не видевшему свет Древ и не бывавшему в Валиноре.
Ряд писателей, а также разработчики ролевых систем, в своих произведениях выводят тёмных эльфов как отдельную разновидность расы эльфов, часто упоминая о «разделении» двух народов, единых в древности. Наиболее известным образом современных тёмных эльфов являются дроу из ролевой системы Dungeons & Dragons, вобравшие в себя многие черты как мифических свартальвов (тёмная кожа, жизнь под землей, и т. д.), так и толкиеновских орков (злобность, черная кожа, боязнь света).
Заключение
Само слово «эльф», по сути, является неким обобщением — эльфами называют лесных духов, фей, фейри, подземный народец и даже троллей. Забавных существ, сопровождающих Санта-Клауса и помогающих ему разносить подарки называют рождественскими эльфами.
Различия образов эльфов в произведениях Вильяма Шекспира и Джона Толкиена объясняются, тем, что Шекспир включал в свои произведения персонажей английского фольклора и народных сказок, в то время как Толкиен в своих романах использовал материал, взятый из «Эдды» и других германских сказаний.
Под влиянием времени мифы об эльфах, их внешнсть и нравы менялись. Их первоначальный облик и предназначение затерялись, так как корнями мифы об эльфах уходят в эпоху язычества. Сейчас образ эльфов и их роль в литературных произведениях зависит от воли автора и его представлении об этом волшебном народе.
См. также
- Эльфы (Плоский мир)
- Эльфы (Средиземье)
- Дроу
- Эльфы TES
- Эльфы (Disciples)
- Ночные эльфы мира Warcraft
- Феи
- Эльдары (Средиземье)
- Эльдары (Warhammer 40,000)
- Эльфы у Шекспира
Использованная литература
- Скандинавская мифология: Энциклопедия. — М: Изд-во Эксмо; СПб.: Мидгард, 2005. — 592 с, ил. ISBN 5-699-11536-6.
- Орлов. М. Духи народных сказаний //Орлов М., Амфитеатров А. История сношения человека с дьяволом / Сборник. — М.: Изд-во Эксмо, СПб.: Terra Fantastica, 2003. — 800 с (Великие посвящённые). ISBN 5-699-04469-8
- Суккуб // Роббинс Р. Х. Энциклопедия колдовства и демонологии / Роббинс Р. Х; Пер. с англ. Т. М. Колядич, Ф. С. Капицы. — М.: ООО «Издательство Астрель»: МИФ: ООО «Издательство АСТ», 2001. — 560 с.: ил. — («ADMARGINEM»). ISBN 5-17-008093-X (ООО «Издательство АСТ»), ISBN 5-271-02118-1 (ООО «Издательство Астрель»), ISBN 5-87214-066-5 (Издательство «Миф»).
- Кораблев Л. Л. «Из рассказов о древнеисландском колдовстве и Сокрытом Народе», М: Изд-во София, 2003—176 с ISBN 5-9550-0008-9
Ссылки
- Бестиарий. Эльфы
- Мифологическая энциклопедия. Эльфы
- Журнал «Мир фантастики». «Введение в эльфоведение»
Wikimedia Foundation . 2010 .