Библиотечные символы и пользовательские символы в ELF

#elf #symbol-table

#elf #таблица символов

Вопрос:

Мои вопросы связаны с символами в ELF. Как мы знаем, таблица символов ELF содержит информацию, необходимую для поиска и перемещения символьных определений и ссылок программы.

Мой вопрос в том, можем ли мы различать ч / б библиотечный символ и определяемый пользователем символ (если оба являются глобальными)? рассмотрим сценарий, в котором исходный код недоступен и у вас есть только ELF.

Комментарии:

1. Что вы подразумеваете под «библиотечным символом» и «пользовательскими символами»?

2. под «библиотечным символом» я подразумеваю библиотечные переменные. то же, что и пользовательский символ, означает определяемые пользователем переменные в программе

3. Но что отличает их? Рассмотрим реализацию библиотеки. Эти символы определяются пользователем или библиотекой?

4. О, и, кстати, для чего вам это нужно? Возможно, указание этого прояснит, какую точную разницу вам нужно зафиксировать.

5. из библиотеки я имею в виду переменные и функции glibc. У меня есть linux ELF. Я создал инструмент времени выполнения, который выбирает функции из ELF и находит общие глобальные переменные с другими функциями на лету. но я хочу это только для пользовательских функций (функций в программе) Я не хочу включать функции glibc (например, printf). есть ли какой-либо способ определить из таблицы символов?

Ответ №1:

Статическая библиотека — это просто архив несвязанных объектных файлов ( .o ) (с индексом для ускорения поиска компоновщиком символов в нем). Когда вы связываетесь с такой библиотекой, компоновщик берет каждый неразрешенный символ и пытается найти его там. Если он находит его, он извлекает соответствующий объект и добавляет его в коллекцию для ссылки. Итак, нет, вы не можете определить, происходит ли symbol из статической библиотеки.

Если у вас есть другой экземпляр библиотеки, который достаточно близок к тому, с чем был связан исполняемый файл, вы можете посмотреть, какие символы он определяет, а затем предположить, что все эти символы плюс любые символы, от которых они зависят, взяты из библиотеки.

Конечно, можно указать символы, определенные в общей библиотеке, потому что это остается другим файлом.

Но есть еще один момент: скорее всего, незаконно предоставлять двоичный файл Linux без источников, статически связанных с libc. То есть, это определенно незаконно, если этот libc является GNU Libc, потому что он распространяется на условиях LGPL, а LGPL требует предоставления (по запросу) источников всего производного кода, за исключением кода, который связан с ним динамически. Если он использует другой libc, такой как sourceware newlib или bionic libc (Android) (я не могу найти другого). Однако я не уверен, насколько хорошо такой код будет работать в системе на основе GNU libc.