Доброго времени суток, господа! :)
Опишу коротко, может быть кто-то сталкивался или в курсе как данная проблема решается, заранее спасибо за внимание.
Есть необходимость пересобрать программный комплекс, поставляющийся под RedHat 7.3, d в операционной среде FreeBSD (FreeBSD 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12 11:05:30 UTC 2007 root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/SMP i386) поскольку в режиме совместимости некоторые бинарники работают некорректно. Комплекс поставляется с исходными кодами, но работает с библиотеками стороннего разработчика, которые включены в дистрибутив только в прекомпилированном в виде статических библиотек (.a)
При линковке данных библиотек линкер выдает следующее:
gcc -v -nostdlib -lc -lgcc -I... -o test test.c ... -lPGSTK -lc -lgcc Reading specs from /usr/local/lib/gcc-lib/i386-portbld-freebsd6.2/2.8.1/specs gcc driver version 2.8.1 executing gcc version 2.96 /usr/local/lib/gcc-lib/i386-portbld-freebsd6.2/2.8.1/cpp -lang-c -v -I. -I... -iprefix i386-portbld-freebsd6.2/2.8.1/ -undef -D__GNUC__=2 -D__GNUC_MINOR__=96 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem(posix) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__tune_i386__ test.c /tmp/ccl5bfNW.i Using builtin specs. gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110) cpp0 -lang-c -v -I... -iprefix i386-redhat-linux/2.96/ -D__NO_INLINE__ -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__tune_i386__ -D__GNUC__=2 -D__GNUC_MINOR__=96 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ -D__linux__ -D__unix -D__linux -Asystem(posix) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__tune_i386__ -iprefix i386-portbld-freebsd6.2/2.8.1/ test.c -o /tmp/ccl5bfNW.i GNU CPP version 2.96 20000731 (Red Hat Linux 7.3 2.96-110) (cpplib) (i386 Linux/ELF) #include "..." search starts here: #include <...> search starts here: . ... (список опущен) End of search list. /usr/local/lib/gcc-lib/i386-portbld-freebsd6.2/2.8.1/cc1 /tmp/ccl5bfNW.i -quiet -dumpbase test.c -version -o /tmp/ccl5bfNW.s GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-110) (i386-redhat-linux) compiled by GNU C version 2.96 20000731 (Red Hat Linux 7.3 2.96-110). as -V -Qy -o /tmp/ccl5bfNW1.o /tmp/ccl5bfNW.s GNU assembler version 2.11.93.0.2 (i386-redhat-linux) using BFD version 2.11.93.0.2 20020207 /usr/local/lib/gcc-lib/i386-portbld-freebsd6.2/2.8.1/collect2 -m elf_i386_fbsd -dynamic-linker /lib/ld-linux.so.2 -o test -L/data/seadas/hdf/TOOLKIT/lib/linux -L -L/usr/local/lib/gcc-lib/i386-portbld-freebsd6.2/2.8.1 -L/usr/local/lib -lc -lgcc /tmp/ccl5bfNW1.o -lPGSTK -lc -lgcc /usr/local/lib/libhdf5.a /usr/local/lib/libmfhdf.a /usr/local/lib/libdf.a /usr/local/lib/libz.a /usr/local/lib/libjpeg.a /usr/local/lib/libsz.a /usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000008048b60 .../libPGSTK.a(IO0_GetHeader)(.text+0x17d): In function `PGS_IO_L0_GetHeader': : undefined reference to `__errno_location' ...libPGSTK.a(IO0_GetHeader)(.text+0x25d): In function `PGS_IO_L0_GetHeader': : undefined reference to `__strtol_internal' ... и тому подобное... : undefined reference to `stderr'
По именам референсов видно, что проблема при линковке библиотеки libgcc.
Здесь в качестве эксперимента были задействованы libgcc и libc вместе с libgcc.a libc.a и динамическими .so из дистрибутива RedHat, никаких отличий от линковки библиотек FreeBSD нет, как это ни странно. Проверено, что линкер берет именно те библиотеки, которые нужно. Казалось бы, все референсы должны быть определены, так как в редхатовских библиотеках они присутствуют. Всё остальное, не использующее эту библиотеку (libPGSTK) нормально компилируется и работает.
Вот поэтому и вопрос: в чем еще может быть проблема? :)