LINUX.ORG.RU

Какие-то прямо чудеса при сборке библиотеки. Как найти ошибку.

 , ,


0

1

Заранее извиняюсь за сумбур. Очень странная проблема.

Есть библиотека виджетов для Motif/X11. Собирается с помощью autotools. В составе пакета сами исходники библиотеки и примеры/тесты. Все собиралось и работало. Некоторое время назад переделал в библиотеке кое-что и добавил новый виджет. Соответственно добавил 3 теста/примера. Один из тестов вываливается с ошибкой.

Ошибка представляет собой сообщение о том, что неверно указано окно, для которого запрошено изменение каких-то параметров. Аналогичные ошибки я встречал неоднократно, когда при сборке приложения для Motif/Xt/X11 библиотеки указываются в некорректном порядке. Но у меня при сборке тестов в этом смысле все правильно. Это стало склонять меня к подозрению, что что-то не так с линковкой. К тому же другие тесты работали.

Поставил обработчик ошибки. Увидел, что после 3 ошибок выскакивает сообщение, что не определен код метода realise, и идет завершение. Два теста из трех работают. Все используют один и тот же виджет. И в тестах отличий по минимуму. Достаточно в неработающий тест добавить при создании виджета определение ресурса, например, изменить размер рамки, и тест отрабатывает.

Поэкспериментировал со старыми тестами. Добился, что один тест тоже стал вываливаться с аналогичной ошибкой, если в нем сократить все действия до минимума. То есть создаем виджет в топлевеле и ничего более. Хотя все это может не означать какой-либо закономерности. Просто какое-то стечение непонятных условий. Все это приводит меня в полное замешательство.

Тогда я взял и написал для сборки всего этого простой makefile. С ним все собирается и работает. Кинул собранную библиотеку в проект с autotools. Пересобрал тесты. Все тесты работают.

Что делать непонятно. Даже не знаю, что еще проверить, или поковырять. Что посоветуете?

Методом научного тыка нашел, как победить проблему. Правда до конца не понял, отчего получался такой эффект. В директивах AC_CHECK_LIB надо было самому отрабатывать результат. А без этого автоматом линкеру при сборке библиотеки передавались в аргументах имена других библиотек. В результате в библиотеку добавлялись какие-то дополнительные символы. И с такой библиотекой возникали описанные глюки. Что там эти символы портили, да еще так избирательно случайным образом, не представляю. Хотелось бы конечно понять, в чем же там суть. Может кто посоветует, что почитать как устроены всякие линкеры и загрузчики?

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

До сих пор очень много воды и мало фактического материала.

Нет примера «плохого» использования AC_CHECK_LIB. Нет примера «правильного» использования.

Нет примера, какой мусор и в каком виде передавался линкеру.

Исходный код, опубликованный в Zip-архиве (вместо любого Git-хостинга) — это признак (отсутствия) уважения к тем, кто может прочитать код и помочь решить задачу.

При всём уважении, у людей вряд ли есть время тратить на чужую проблему больше 5-10 минут времени. Задача поставлена туманно. А желающих поговорить за жизнь нет.

Bass ★★★★★
()
Последнее исправление: Bass (всего исправлений: 1)
Ответ на: комментарий от Bass

Нет примера «плохого» использования AC_CHECK_LIB. Нет примера «правильного» использования.

Было, например, так:

AC_CHECK_LIB(X11, XCopyArea, , AC_MSG_RESULT([X11 lib not found]))

Теперь использую следующий вариант:

AC_CHECK_LIB(X11, XCopyArea, [xlib_LDFLAG=«-lX11»], AC_MSG_RESULT([X11 lib not found]))

Нет примера, какой мусор и в каком виде передавался линкеру.

В некорректном варианте при успешной проверке наличия библиотеки в переменную LDFLAGS добавлялось -lX11. И такие параметры передавались libtool при сборке библиотеки. В результате в библиотеки появлялось что-то такое:

0000000000062f10 B bss_end

0000000000062f10 B bss_end_

0000000000062ca8 B __bss_start

0000000000062ca8 B bss_start

Я не представляю, что это может значить, и как это и на что влияет. В данном случае я имею в виду именно механизм. Конечный результат я наблюдал. Если собирать библиотеку просто ручками без всяких бессмысленных -l<что-то там>, то в получающейся библиотеке указанных выше символов не обнаруживается. И в этом случае указанные в моем первом посте проблемы не проявляются. Поскольку в данном случае я не понимаю всего механизма происходящего, я не уверен до конца, что проблема окончательно устранена. И был бы благодарен объяснению. Но как минимум текущее решение работает.

zloy_starper ★★★
() автор топика
Последнее исправление: zloy_starper (всего исправлений: 1)
Ответ на: комментарий от Bass

Исходный код, опубликованный в Zip-архиве (вместо любого Git-хостинга) — это признак (отсутствия) уважения к тем, кто может прочитать код и помочь решить задачу.

Ну для начала не в Zip-архиве. Код, который собирается autotools представлен в стандартном виде, который принят для распространения с незапамятных времен.

При всём уважении, у людей вряд ли есть время тратить на чужую проблему больше 5-10 минут времени. Задача поставлена туманно. А желающих поговорить за жизнь нет.

Честно сказать, я не особенно то рассчитывал, что кто-то будет смотреть именно исходники. По нескольким причинам мне представляется это бессмысленным. Уж в течении 5-10 минут точно. Наверное, смотреть правила сборки на Git-хостинге удобнее. Не буду спорить. Вся надежда была на то, что кто-то сталкивался с чем-то подобным. Объяснение проблемы было, вероятно, сумбурным. Но и сама проблема для меня явилась уж совсем неожиданной.

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