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

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

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


person user983455    schedule 07.10.2011    source источник
comment
Что вы подразумеваете под библиотечными символами и пользовательскими символами?   -  person Jan Hudec    schedule 07.10.2011
comment
из символа библиотеки я имею в виду библиотечные переменные. то же, что и пользовательский символ, означает определяемые пользователем переменные в программе   -  person user983455    schedule 16.12.2011
comment
Но чем они отличаются? Рассмотрите возможность реализации библиотеки. Являются ли эти символы пользовательскими или библиотечными?   -  person Jan Hudec    schedule 16.12.2011
comment
А, кстати, для чего он нужен? Возможно, если вы это сделаете, станет яснее, какую именно разницу вам нужно зафиксировать.   -  person Jan Hudec    schedule 16.12.2011
comment
из библиотеки я имею в виду переменные и функции glibc. У меня линукс ЭЛЬФ. Я сделал инструмент времени выполнения, который выбирает функции из ELF и на лету находит общие глобальные переменные с другими функциями. но я хочу это только для пользовательских функций (функций в программе). Я не хочу включать функции glibc (например, printf). есть ли способ обнаружить из таблицы символов?   -  person user983455    schedule 17.12.2011


Ответы (1)


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

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

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

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

person Jan Hudec    schedule 07.10.2011