LINUX.ORG.RU

Символы в объектных файлах


0

2

Приветствую вас, уважаемые колеги. Столкнулся с очередной своей проблемой незнания. Сущесвтует такое понятие как «символы» в объектных файлах. На пример мануал по nm пишет что «nm - lists symbols from object files». А мне стыдно что будучи программистом я не знаю что это такое. Везде и всюду свободно используется это слово, но нигде не дается его определения. По крайней мере я не нашел определения ни на русском ни на английском языках. Прошу знатоков в этом вопросе указать источник информации где я смог бы получить всеобъемлющие разъяснения об этом понятии, либо разъяснения дать самим. Благодарю за внимание.

★★★

Скорее http://en.wikipedia.org/wiki/Symbol_table т.к. символы бывают и не отладочными.

Символ — это текстовое имя в объектном файле, которое ссылается на функцию, реже на переменную. Экспортируемый символ — ссылка на функцию, которая экспортируется из модуля. Импортируемый символ — ссылка на функцию, которой в модуле нет.

ringill
()
Ответ на: комментарий от cx

А при чем тут debug-символы? ТС-то явно спрашивает про то, что выдает readelf -s.

anonymous
()

Грубо говоря, если в твоем модуле есть функция main(), которая использует функцию eba() из другого модуля, то в объектном файле будет экспортироваться символ _main и импортироваться символ _eba. И линкер этой информацией воспользуется, когда будет собирать исполнимый бинарник.

anonymous
()

Всем большое спасибо за отклик, особенно ringill и ananas за ссылку на Symbol table в википедии. Про символы отладки в википедии я уже читал, но эта статья не дает ответов на интересующие меня вопросы. Теперь мне все ясно, но все равно не покидает чувство будто где то должно быть прямое определение непосредственно термина «символы».

Еще вопрос на засыпку. Как сказывается на работе приложения результат обработки утилитой strip и как это влияет на библиотеки, собенно если вызвать с параметром --strip-all? Ведь чтобы обратиться к библиотечной функции по имени в ней должны быть экспортируемые символы, так?

normann ★★★
() автор топика

Приблизительно: в объектном файле есть два списка, которые называются «список импортируемых символов» и «список экспортируемых символов». В каждом из них прописаны 1) строка, которая называется «имя символа», и 2) адрес внутри этого файла, который для экспортируемых может называться «адрес символа» или «смещение символа». Часто есть ещё какая-то информация.

Подразумевается, что для экспортируемого символа объектный файл «знает», где этот символ находится, а находится он в этом самом файле. А вот про импортируемые символы такой информации у него нет, но она ему нужна, и записанное число — это просьба для линкера «а запиши мне вот по такому-то адресу, где я могу найти символ с таким именем».

В упомянутом примере, в одном файле (eba.o) будет экспортироваться символ eba (его адрес будет адресом функции eba — но об этом линкер знать не обязан, это не его забота), в другом (main.o) будет символ eba импортироваться. Линкер пропишет адрес экспортируемого символа (т.е., адрес eba) по указанному в main.o смещению. А это смещение будет, например, указывать на аргумент команды call. В результате получится, что в окончательном бинарнике call идёт как раз по нужному адресу.

Это очень грубо, но для начального понимания годится.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.