LINUX.ORG.RU

[C,C++][nmap][arm] Проблемы конечной линковки с libc и прочим

 ,


0

0

Добрый день! Удалось почти победить кросс-сборку nmap под arm тулчейном gcc+uClibc. Одако на самом последнем этапе - линковке возникли проблемы. nmap загружаю из svn.

Вот строка конфигурации:

./configure --host=arm-android-linux-uclibcgnueabi CC="arm-android-linux-uclibcgnueabi-gcc" \
CXX="arm-android-linux-uclibcgnueabi-g++" STRIP="arm-android-linux-uclibcgnueabi-strip" \
AR="arm-android-linux-uclibcgnueabi-ar" AS="arm-android-linux-uclibcgnueabi-as" \
CPP="arm-android-linux-uclibcgnueabi-cpp" LD="arm-android-linux-uclibcgnueabi-ld" \
RANLIB="arm-android-linux-uclibcgnueabi-ranlib" OBJDUMP="arm-android-linux-uclibcgnueabi-objdump" \
NM="arm-android-linux-uclibcgnueabi-nm" CROSS_COMPILE="arm-android-linux-uclibcgnueabi-" \
CFLAGS=" -nodefaultlibs -nostdlib -fPIC -static $_XXFLAGS -DHAVE_GETADDRINFO -DHAVE_USLEEP -DHAVE_GETTIMEOFDAY \
-DHAVE_SNPRINTF -DHAVE_VSNPRINTF -DHAVE_STRERROR -Dsys_nerr=_sys_nerr -Dsys_errlist=_sys_errlist" \
CXXFLAGS=" -c -nodefaultlibs -nostdlib -fPIC -static $_XXFLAGS -DHAVE_GETADDRINFO -DHAVE_USLEEP -DHAVE_GETTIMEOFDAY \
-DHAVE_SNPRINTF -DHAVE_VSNPRINTF -DHAVE_STRERROR -Dsys_nerr=_sys_nerr -Dsys_errlist=_sys_errlist" \
CPPFLAGS=" -I$HOME/build/cross/sys-root/usr/include" \
LDFLAGS=" -nodefaultlibs -nostdlib -fPIC -static -s -L$HOME/build/cross/sys-root/usr/lib -zmuldefs" \
LIBS=" -lm -lc -lgcc -liberty -lgcc_eh -lstdc++" \
--prefix="$HOME/build/cross/sys-root/usr" --with-liblua=included --with-libpcre=included \
--with-libdnet=included --without-ncat --with-libpcap=included --with-pcap=linux ac_cv_linux_vers=2.6.29

Все проходит нормально, но возникли трудности при линковке конечного бинарника:

.arm-android-linux-uclibcgnueabi-g++: unrecognized option '-zmuldefs'
/home/xvilka/build/cross/sys-root/usr/lib/libc.a(memcmp.os): In function `__GI_memcmp':
(.text+0x0): multiple definition of `memcmp'
libdnet-stripped/src/.libs/libdnet.a(memcmp.o):memcmp.c:(.text+0x0): first defined here
/home/xvilka/build/x-tools/arm-android-linux-uclibcgnueabi/lib/gcc/arm-android-linux-uclibcgnueabi/4.4.3/../../../../arm-android-linux-uclibcgnueabi/bin/ld: warning: cannot find entry symbol _start; defaulting to 00008100
main.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cc:(.text+0x106c): undefined reference to `__dso_handle'
nmap.o: In function `__static_initialization_and_destruction_0(int, int)':
nmap.cc:(.text+0xb96c): undefined reference to `__dso_handle'
targets.o: In function `__static_initialization_and_destruction_0(int, int)':
targets.cc:(.text+0x234c): undefined reference to `__dso_handle'
tcpip.o: In function `__static_initialization_and_destruction_0(int, int)':
tcpip.cc:(.text+0xb938): undefined reference to `__dso_handle'
nmap_error.o: In function `__static_initialization_and_destruction_0(int, int)':
nmap_error.cc:(.text+0x3dc): undefined reference to `__dso_handle'
utils.o:utils.cc:(.text+0x2c70): more undefined references to `__dso_handle' follow
/home/xvilka/build/cross/sys-root/usr/lib/libstdc++.a(locale-inst.o): In function `int std::__int_to_char<char, unsigned long long>(char*, unsigned long long, char const*, std::_Ios_Fmtflags, bool)':
/home/xvilka/build/toolchain-android/targets/arm-android-linux-uclibcgnueabi/build/build-cc/arm-android-linux-uclibcgnueabi/libstdc++-v3/include/bits/locale_facets.tcc:783: undefined reference to `__aeabi_uldivmod'
/home/xvilka/build/toolchain-android/targets/arm-android-linux-uclibcgnueabi/build/build-cc/arm-android-linux-uclibcgnueabi/libstdc++-v3/include/bits/locale_facets.tcc:784: undefined reference to `__aeabi_uldivmod'
/home/xvilka/build/cross/sys-root/usr/lib/libstdc++.a(locale-inst.o): In function `std::__convert_from_v(int* const&, char*, int, char const*, ...)':
/home/xvilka/build/toolchain-android/targets/arm-android-linux-uclibcgnueabi/build/build-cc/arm-android-linux-uclibcgnueabi/libstdc++-v3/include/arm-android-linux-uclibcgnueabi/bits/c++locale.h:76: undefined reference to `vsprintf'
/home/xvilka/build/cross/sys-root/usr/lib/libstdc++.a(locale-inst.o): In function `std::istreambuf_iterator<char, std::char_traits<char> > std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char> > >::_M_extract_int<unsigned long long>(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, std::_Ios_Iostate&, unsigned long long&) const':
/home/xvilka/build/toolchain-android/targets/arm-android-linux-uclibcgnueabi/build/build-cc/arm-android-linux-uclibcgnueabi/libstdc++-v3/include/bits/locale_facets.tcc:455: undefined reference to `__aeabi_uldivmod'
/home/xvilka/build/cross/sys-root/usr/lib/libstdc++.a(locale-inst.o): In function `std::istreambuf_iterator<char, std::char_traits<char> > std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char> > >::_M_extract_int<long long>(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, std::_Ios_Iostate&, long long&) const':
/home/xvilka/build/toolchain-android/targets/arm-android-linux-uclibcgnueabi/build/build-cc/arm-android-linux-uclibcgnueabi/libstdc++-v3/include/bits/locale_facets.tcc:455: undefined reference to `__aeabi_uldivmod'
/home/xvilka/build/cross/sys-root/usr/lib/libstdc++.a(basic_file.o): In function `std::__basic_file<char>::showmanyc()':
/home/xvilka/build/toolchain-android/targets/arm-android-linux-uclibcgnueabi/build/build-cc/arm-android-linux-uclibcgnueabi/libstdc++-v3/src/basic_file.cc:362: undefined reference to `fstat64'
/home/xvilka/build/cross/sys-root/usr/lib/libstdc++.a(basic_file.o): In function `xwritev':
/home/xvilka/build/toolchain-android/targets/arm-android-linux-uclibcgnueabi/build/build-cc/arm-android-linux-uclibcgnueabi/libstdc++-v3/src/basic_file.cc:155: undefined reference to `writev'
/home/xvilka/build/cross/sys-root/usr/lib/libstdc++.a(c++locale.o): In function `void std::__convert_to_v<long double>(char const*, long double&, std::_Ios_Iostate&, int* const&)':
/home/xvilka/build/toolchain-android/targets/arm-android-linux-uclibcgnueabi/build/build-cc/arm-android-linux-uclibcgnueabi/libstdc++-v3/src/c++locale.cc:175: undefined reference to `strtold'
/home/xvilka/build/cross/sys-root/usr/lib/libstdc++.a(c++locale.o): In function `void std::__convert_to_v<float>(char const*, float&, std::_Ios_Iostate&, int* const&)':
/home/xvilka/build/toolchain-android/targets/arm-android-linux-uclibcgnueabi/build/build-cc/arm-android-linux-uclibcgnueabi/libstdc++-v3/src/c++locale.cc:66: undefined reference to `strtof'
/home/xvilka/build/cross/sys-root/usr/lib/libstdc++.a(eh_globals.o): In function `__static_initialization_and_destruction_0':
/home/xvilka/build/toolchain-android/targets/src/gcc-4.4.3/libstdc++-v3/libsupc++/eh_globals.cc:110: undefined reference to `__dso_handle'
collect2: ld returned 1 exit status
make[1]: *** [nmap] Error 1
make: *** [all] Error 2

А вот какой строчкой он собственно линкует:

arm-android-linux-uclibcgnueabi-g++ -Llibpcap -Wl,-E  -nodefaultlibs -nostdlib -fPIC -static -s -L/home/xvilka/build/cross/sys-root/usr/lib -zmuldefs -Lnbase -Lnsock/src/   -o nmap main.o nmap.o targets.o tcpip.o nmap_error.o utils.o idle_scan.o osscan.o osscan2.o output.o payload.o scan_engine.o timing.o charpool.o services.o protocols.o nmap_rpc.o portlist.o NmapOps.o TargetGroup.o Target.o FingerPrintResults.o service_scan.o NmapOutputTable.o MACLookup.o nmap_tty.o nmap_dns.o  traceroute.o portreasons.o nse_main.o nse_nsock.o nse_fs.o nse_nmaplib.o nse_debug.o nse_pcrelib.o nse_binlib.o nse_bit.o  -lnbase -lnsock libpcre/libpcre.a -lpcap  libdnet-stripped/src/.libs/libdnet.a liblua/liblua.a -ldl  -lm -lc -lgcc -liberty -lgcc_eh -lstdc++

Уже почти вчера весь вечер бился над исходниками nmap и ничего не вижу - нужен взгляд со стороны. Спасибо!

★★★★★

Зачем это вам ? Навскидку - попробуй собирать с опциями:

    --with-libpcre=included --with-liblua=included \
    --with-libpcap=included --without-zenmap \
    --without-ndiff --disable-nls
и тулчейн какой-то странный и почему в триплетах нет упоминания об uclibc ?

anonymous
()
Ответ на: комментарий от anonymous

тулчейн собственной сборки, триплеты если указывать uclibc то выдает ошибку, ndiff собирается отлично, это ncat почему-то не внемлет голосу configure и устанавливает свои переменные (но это исправлю патчем, позже, когда допилю все остальное), nls и zenmap и так отключаются по результатам configure.

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

Есть множество автоматизированных средств сборки, в том числе и тулчейн собирается. uclibc в триплетах обязательно нужен, от этого может зависеть поведение скриптов. То что вы тут вручную все это делаете называется по-русски суходрочка :)

anonymous
()
Ответ на: комментарий от anonymous

Если не знаете ответа - не отвечайте.
Тулчейн собирал сам но с помощью crosstool-ng. В автоматизированных системах сборки:
а) нет nmap (точнее не видел);
б) нет поддержки моей платформы.

пы.сы. Решение где-то на поверхности, но пока не вижу

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

>Тулчейн собирал сам но с помощью crosstool-ng.

Если бы ты не задавал там свои глупые триплеты - он бы тебе их сам правильно выставил.

а) нет nmap (точнее не видел);

как добавить новый пакет в том же buildroot хорошо описано в документации, даже без статей интуитивно понятно, достаточно для примера взять любой готовый. Кроме того в T2 nmap точно есть.

б) нет поддержки моей платформы.

Фееричненько :) Хочешь сказать arm никто не поддерживает ? Так они arm _все_ поддерживают.

anonymous
()
Ответ на: комментарий от XVilka

Потом я так и не понял - зачем тебе uclibc если ты собираешь такие пакеты как nmap? Он один наверно в несколько раз больше места занимает чем uclibc. Есть готовые бесплатные _профессиональные_ тулчейны, например тут http://www.codesourcery.com/sgpp/lite/arm/ Если тебе так уж необходим твой личный тулчейн и не подходит то что в buildroot, достаточно указать это в конфиге, он позволяет это.

anonymous
()
Ответ на: комментарий от anonymous

Извиняюсь за грубый тон в пред посте.

Но я не понимаю чем глупы триплеты

arm-android-linux-uclibcgnueabi

Я просто вместо unknown поставил android - потому как я то знаю что это android. Все остальное выставил как раз таки crosstool-ng:

arm-unknown-linux-uclibcgnueabi

По поводу buildroot-а все правильно - после того как получиться-таки собрать nmap вручную - добавлю скрипты для его сборки в buildroot. Никто же за меня этого не сделает. Поэтому важно все сначала проверить, потом уже включать. У готовых тулчейнов есть свои недостатки, в частности плохая оптимизация и некоторые глюки.

Да и не вижу особенной профессиональности в codesourcery. Если почитать отзывы на сайте crosstool-ng то понятно что его продукт используют так называемые профессионалы. Да и Ян Морин производит впечатление человека весьма неглупого, исходя из опыта общения.

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

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

>Но я не понимаю чем глупы триплеты

arm-android-linux-uclibcgnueabi

Блин, это уже я тормоз - просмотрел, все правильно :) Прошу прощения.

Все это замечательно, но по поводу самой ошибки, есть какие-либо идеи.

По мне так явно с uclibc проблема. С ними вообще много траха бывает на пустом месте, особенно в связке с g++, и особенно это касается поддержки локалей.

anonymous
()
Ответ на: комментарий от XVilka

>Да и не вижу особенной профессиональности в codesourcery.

Достаточно посмотреть на список маинтэенров порта ARM в gcc

arm port Nick Clifton nickc@redhat.com arm port Richard Earnshaw richard.earnshaw@arm.com arm port Paul Brook paul@codesourcery.com

и более 7000 упоминаний в исходниках gcc, а вот вклада от Ян Морин я там не наблюдаю вообще :)

anonymous
()
Ответ на: комментарий от anonymous

Ну поддержку локалей я отключил везде, это верно, с ними слишком много проблем. Просто подобную ошибку я встречал пару раз на просторах интернета, но нигде не было ответа, да и специфика там совсем другая. Но кстати там было не uClibc

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

В общем я не знаю в чем у тебя проблема, у меня в buildroot все собирается с внешним тулчейном, я его делал в crosstool-ng, uClibc-0.9.30.1, gcc-4.2.4, arm-unknown-linux-uclibcgnueabi-gcc. К сожалению не знаю какие были конфиги, у меня с этим бардак, при желании можно восстановить, там ничего сверхъестественного нет. Вот я тебе накидал для сборки в buildroot:

# pwd
/home/.../buildroot-2009.11/package/nmap
# ls 
Config.in  nmap.mk  nmap_nostrip.patch
# cat Config.in 
config BR2_PACKAGE_NMAP
	bool "nmap"
	help
	  nmap - utility for network exploration or security auditing
	  

# cat nmap.mk 
#############################################################
#
# nmap
#
#############################################################

NMAP_VERSION = 5.21
NMAP_SOURCE = nmap-$(NMAP_VERSION).tar.bz2
NMAP_SITE = http://nmap.org/dist
NMAP_INSTALL_TARGET_OPT = DESTDIR=$(TARGET_DIR) install
NMAP_LIBTOOL_PATCH = NO
NMAP_CONF_ENV:=ac_cv_linux_vers=$(firstword $(subst .,$(space),$(firstword $(call qstrip,$(BR2_DEFAULT_KERNEL_HEADERS)))))

NMAP_CONF_OPT = --with-libpcre=included --with-liblua=included  --with-libpcap=included  \
                --with-pcap=linux --without-zenmap --without-ndiff --disable-nls
		

NMAP_DEPENDENCIES = uclibc

$(eval $(call AUTOTARGETS,package,nmap))
# cat nmap_nostrip.patch 
diff -Naur nmap-5.21/ncat/Makefile.in nmap-5.21_/ncat/Makefile.in
--- nmap-5.21/ncat/Makefile.in	2010-01-11 19:41:56.000000000 +0000
+++ nmap-5.21_/ncat/Makefile.in	2010-02-27 04:00:47.000000000 +0000
@@ -131,7 +131,7 @@
 install: $(TARGET)
 	@echo Installing Ncat;
 	$(SHTOOL) mkdir -f -p -m 755 $(DESTDIR)$(bindir) $(DESTDIR)$(pkgdatadir) $(DESTDIR)$(mandir)/man1
-	$(INSTALL) -c -m 755 -s ncat $(DESTDIR)$(bindir)/ncat
+	$(INSTALL) -c -m 755 ncat $(DESTDIR)$(bindir)/ncat
 	$(INSTALL) -c -m 644 $(DATAFILES) $(DESTDIR)$(pkgdatadir)/
 	$(INSTALL) -c -m 644 docs/$(TARGET).1 $(DESTDIR)$(mandir)/man1/$(TARGET).1
anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.