Можно ли ссылаться на внешние символы? - PullRequest
2 голосов
/ 14 января 2010

Можно ли ссылаться на внешние символы или преобразовывать их во внешние символы?

Я спрашиваю только потому, что (большая) библиотека, которую я хочу использовать, имеет ночную сборку, но с разделенными символами. Я бы предпочел использовать ночные, а не тратить полдня на его компиляцию.

Ответы [ 4 ]

1 голос
/ 14 января 2010
Библиотека

Stripped означает только то, что символы отладки были удалены.Остальная часть библиотеки на месте.Проблема, с которой вы можете столкнуться, связываясь с такой библиотекой, заключается в предупреждении компоновщика об отсутствии символов отладки.Другая проблема, которую вы можете получить с удаленной библиотекой, - это отладка без надлежащих символов отладки, это немного забавно.

К вопросу о внешних / внешних символах (вы имеете в виду экспортированные?), Если вы ссылаетесь настатическая библиотека, ей не нужно определять какие-либо «экспорты», так как она связана с вашим кодом просто как большой объектный файл.Связывание с динамической библиотекой немного отличается в зависимости от платформы, которая вас интересует. В Windows ваша dll должна объявить функцию, которую вы хотите использовать как (declspec) __dllexport.В Linux, если память мне не нужна, нет необходимости объявлять что-либо подобное, и вы можете использовать свои функции из файла .so, как если бы они были в вашем коде, аналогично статическим библиотекам.

Обновление:

Алекс, я не уверен на 100%, но я верю, что то, что я написал о linux, применимо к OS X в этом случае.Пока у вас есть заголовочный файл с объявлениями функций, вы сможете использовать их очень хорошо.Если у вас нет некоторых функций в предоставленном заголовочном файле, но у вас есть доступ к источникам, вы можете создать свои собственные.Однако это довольно плохая идея, так как авторы SDK не хотели предоставлять вам доступ к этим функциям и не добавляли их в общедоступные заголовочные файлы, поэтому они могут свободно изменять свои функции по своему усмотрению в любое время.потенциально оставляя вас с нерабочим кодом и необходимостью переписывать / перепроектировать определенные вещи.То же самое относится ко всем «недокументированным» функциям, они могут быть изменены или удалены, и если это вызывает у вас проблемы, вы единственный виновный и единственный человек, который будет заботиться.Действуйте с осторожностью.

0 голосов
/ 21 октября 2011

Я знаю, что он старый, но я искал то же самое, кажется, что эта техника может работать:

http://en.wikibooks.org/wiki/Reverse_Engineering/Mac_OS_X#Example

0 голосов
/ 14 января 2010

Я склонен сказать «нет», пока вопрос такой общий.

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

0 голосов
/ 14 января 2010

Нет.Невозможно ссылаться на внешние символы.

По определению внешние символы не экспортируются из компилятора / ассемблера / чего бы то ни было в компоновщик.Эти символы исчезли, исчезли из вселенной, только исчезнувшая память, к тому времени, когда компоновщик видит, что модуль (-и) связан (-ы).

Вернемся в ранний железный век, когда компьютеры все еще были сделаны из дискретныхтранзисторам, компиляторам и ассемблерам можно было бы распечатать таблицы символов для каждого модуля.Сегодня мы называем эту «отладочную информацию», как правило, она НЕ печатается, а хранится где-то, чтобы инструменты отладки могли найти ее в модуле загрузки.И это именно то, что вырывается из вашего ночного телосложения.

Что вы пытаетесь сделать?Если вы пытаетесь получить доступ к подпрограммам (или переменным) в библиотеке, которые явно не являются внешними, то, вероятно, есть веская причина, по которой они не являются внешними.Поговорите с сопровождающими библиотеки, объясните, почему вам нужен доступ к этим подпрограммам (или переменным), и СЛУШАЙТЕ их объяснения, почему они не предоставили такой доступ.

...