Только из уважения ограничусь короткой фразой: Дмитрий, ты не прав.Dimitry Sibiryakov писал(а):В каком месте ее ld найдет, из такого она и загрузится - отвратительнейшее свойство линуксового загрузчика, которое некоторые считают фичей.v6y писал(а):Если так, то из какого, извиняюсь за выражение, места тогда должна вызываться ib_util_malloc?
UDF для FireBird 1.5 i 2.0
Re: UDF для FireBird 1.5 i 2.0
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: UDF для FireBird 1.5 i 2.0
Да ладно, все тут и так знают, что Линух я видел только на картинках. Рассказывай, как тамошний загрузчик обрабатывает undefined symbols. (То, что тамошний линкер их разрешает, я знаю точно - иначе зачем ему ключ --no-undefined?..)v6y писал(а):Только из уважения...
Re: UDF для FireBird 1.5 i 2.0
Прежде всего объясни более детально смысл этой фразы:Dimitry Sibiryakov писал(а):Да ладно, все тут и так знают, что Линух я видел только на картинках. Рассказывай, как тамошний загрузчик обрабатывает undefined symbols. (То, что тамошний линкер их разрешает, я знаю точно - иначе зачем ему ключ --no-undefined?..)v6y писал(а):Только из уважения...
В каком месте ее ld найдет, из такого она и загрузится - отвратительнейшее свойство линуксового загрузчика, которое некоторые считают фичей.
А то я ее скорее всего недопонял и понял так: в Виндусе загрузчик имеет прекрасное свойство грузить даже из тех мест в которых найти не может.
ib_util_malloc в данном случае не может быть найдена по определению - откуда загрузчику знать, что она находится именно в libib_util.so?
Рассказывать про загрузчик собственно нечего: man ld про линкер, man ld.so про загрузчик. Я думаю копипастить маны сюда смысла нет. Про опцию --no-undefined ты уже сам написал - в данном случае добавляешь к параметрам командной строки gcc -Wl,--no-undefined и оно начинает ругаться на ненайденные в указанных для линковки объектниках и шарах функции. Почему не ругается по умолчанию? Потому что предполагает, что соответсвующая шара или код будут подгружены к моменту вызова. Ничего крамольного в этом нет, IMHO, потому как в больших, многомодульных проектах позволяет избежать подключения одних и тех же шар и объектников при компиляции модулей.
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Re: UDF для FireBird 1.5 i 2.0
Хорошо. Рассказываю какое у меня (скорее всего неправильное) представление о работе ld.so: есть конфигурационный файл, где перечислены пути к сошкам. Есть БД функций, экспортируемых этими сошками (иначе зачем запускать какой-то утиль при изменении конфигурации). Если вызывается какая-то внешняя функция, ld ищет ее имя в базе и (если нашел) грузит соответствующую сошку. Если функция с тем же названием экспортируется двумя библиотеками, будет задействована первая попавшаяся.v6y писал(а):Прежде всего объясни более детально смысл этой фразы:
Помидоры?..
Re: UDF для FireBird 1.5 i 2.0
Ключевая "неправильность" твоего понимания:Dimitry Sibiryakov писал(а):Хорошо. Рассказываю какое у меня (скорее всего неправильное) представление о работе ld.so: есть конфигурационный файл, где перечислены пути к сошкам. Есть БД функций, экспортируемых этими сошками (иначе зачем запускать какой-то утиль при изменении конфигурации). Если вызывается какая-то внешняя функция, ld ищет ее имя в базе и (если нашел) грузит соответствующую сошку. Если функция с тем же названием экспортируется двумя библиотеками, будет задействована первая попавшаяся.v6y писал(а):Прежде всего объясни более детально смысл этой фразы:
Помидоры?..
В этой БД (я так полагаю ты имеешь ввиду ld.so.cache) имена функций НЕ ХРАНЯТСЯ, хранятся только пути к библиотекам.
Под Linux откомпилировал, пытаюсь под FreeBSD
в /usr/local/lib есть libib_util.so
компилирую
gcc udf.c -shared -lib_util -fPIC -o udf.so -I/usr/local/share/examples/firebird -I/usr/local/include -I/usr/local/lib
ответ:
/usr/bin/ld: cannot find -lib_util
Есть варианты с каким ключем надо компилировать?
в /usr/local/lib есть libib_util.so
компилирую
gcc udf.c -shared -lib_util -fPIC -o udf.so -I/usr/local/share/examples/firebird -I/usr/local/include -I/usr/local/lib
ответ:
/usr/bin/ld: cannot find -lib_util
Есть варианты с каким ключем надо компилировать?
Есть варианты как не путать lib_util и libib_utilSkyFox писал(а):Под Linux откомпилировал, пытаюсь под FreeBSD
в /usr/local/lib есть libib_util.so
компилирую
gcc udf.c -shared -lib_util -fPIC -o udf.so -I/usr/local/share/examples/firebird -I/usr/local/include -I/usr/local/lib
ответ:
/usr/bin/ld: cannot find -lib_util
Есть варианты с каким ключем надо компилировать?
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Самый простой метод - скопировать/слинковать libib_util.so в /usr/lib, затем на всякий запустить ldconfig и попробовать компильнуть с теми же ключами, что и под Линуксом.SkyFox писал(а):Под Linux откомпилировал, пытаюсь под FreeBSD
в /usr/local/lib есть libib_util.so
компилирую
gcc udf.c -shared -lib_util -fPIC -o udf.so -I/usr/local/share/examples/firebird -I/usr/local/include -I/usr/local/lib
ответ:
/usr/bin/ld: cannot find -lib_util
Есть варианты с каким ключем надо компилировать?
Для справки:
-lsomelib - будет искатьсься libsomelib.so - почитайте man ld там все это написано
Также почитайте man ld.so - там указано каким образом ищутся билиотеки.