2012-09-18 3 views
0

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

Проблема: Я считаю, что у меня есть многократно определенные символы в моем полном пакете (исполняемый файл, который уже содержит код библиотеки пользователей + общие стандартные библиотеки). Очевидно, линкер имеет представление об этом, но, как я понимаю, компоновщик не будет жаловаться, если он не встретит несколько сильных именованных символов. Я боюсь, что, когда я перемещаю свой код с платформы solaris 8/sparc на платформу solaris10/sparc, некоторые стандартные функции unix были реализованы в пользовательских библиотеках, которые приводят к сбою приложения во время выполнения. Обратите внимание, что приложение работает отлично в солярисе 8/Sparc платформы

Я сталкиваюсь странные вопросами, которые привели меня к мысли, что это может быть источником

  1. Изменения одного переменные из одной библиотеки изменяет значение другой переменной в другой библиотеке
  2. Solaris 8-10: host2ip conversion problems

Что мне нужно:

  1. Есть ли способ легко перечислить все умноженные символы?
  2. Есть ли способ легко перечислить все умноженные символы, созданные из пользовательских библиотек?
  3. Вы, ребята, думаете, что проблема № 1 может быть вызвана связыванием проблем, или вы чувствуете, что это может быть признаком какой-то другой проблемы?

Edit1: С тех пор я знаю, что на создание файла карты с помощью ЛДА, то есть раздел умножения определенного символа, который я прохожу, чтобы найти имена, которые выглядят как стандартный вызов библиотеки. Для людей, которые не знают, линкер не сможет ссылаться, если он найдет несколько символов с тем же именем, а имена - сильные имена.

ответ

0

Реальная проблема, что происходит это: библиотека (назовем его lib1) был массив, как показано ниже

#define ARRAY_SIZE 1024 
SomeStruct* global_array[ARRAY_SIZE]; 

Этот массив используется моей другой библиотеке (давайте назовем его lib2), который в свою очередь используется моим приложением, используя для него выражение extern.

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

При определении ARRAY_SIZE снова при компиляции моих библиотек и приложений все начинает вести себя нормально.Я не совсем понимаю, что вызвало проблему и почему она решена, поскольку внешнее объявление массивов не содержит размер. Кроме того, если библиотека действительно использовала MACRO ARRAY_SIZE, тогда почему компиляция не завершилась? Кроме того, существует вероятность, что имя, используемое для определения, является стандартным именем (фактическая строка была FD_SETSIZE)

Мое начальное ощущение относительно компоновщика было неправильным.

0

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

+0

Я пытаюсь понять файл карты. Было бы здорово, если бы вы могли немного рассказать о том, как это поможет. Я использую файл карты, сгенерированный «ld -m» через интерфейс gcc, и, по-видимому, он не имеет символов – IDK

+0

@IDK. Я не уверен, имеет ли значение регистр данных, но убедитесь, что вы используете опцию компоновщика -Map = mapfile.map (если он проходит через gcc, -Wl, -Map = mapfile.map). Названия символов и их местоположения будут сгенерированы в файл карты. Затем вы будете искать символы, которые имеют те же имена, что и unix/stdlib, такие как inet_ntoa_r. Это та часть, где вам, вероятно, придется писать сценарий. – syplex

+0

ld не принимает эту опцию. Я пробовал gcc-2.95.2 -Wl, -Map = mapfile.map и получил ошибку ld: fatal: file ap = mapfile.map: stat failed: Нет такого файла или каталога , поскольку -M это то, что он рассмотрел вариант – IDK

Смежные вопросы