From: Mikhail Yakshin <greycat@altlinux.org> To: ALT Devel discussion list <devel@lists.altlinux.org> Subject: Re: [devel] erlang: asking for a hint, possibly with --as-needed Date: Sun, 11 Feb 2007 23:24:09 +0300 Message-ID: <45CF7B69.10802@altlinux.org> (raw) In-Reply-To: <20070210202323.GB11298@basalt.office.altlinux.org> Dmitry V. Levin wrote: > On Sat, Feb 10, 2007 at 10:47:51PM +0300, Mikhail Yakshin wrote: >> Я тут взялся глобально перелопачивать Erlang > > Значит, всеобщее счастье не за горами. :) Я, пожалуй, не так сильно оптимистичен... >> 2. Эрланг - это довольно объемный пакет, собирается где-то по 30-40 >> минут на сборку. > > На каких мощностях? Тот пакет, который сейчас в Сизифе, собирается раза в > 2 быстрее. Видимо, на сборочных серверах и полностью в tmpfs. Какой смысл сравнивать? >> Сборочное окружение субъективно мною характеризуется >> как "невменяемое": масса хаков вокруг autoconf на тему поддержки >> совместимости с win32, вывернутая наизнанку схема генерации >> Makefile <-> Makefile.in, > > Это как? Из Makefile формируются Makefile.in? Все Makefile, как правило, не генерящиеся. В них записано по 3 строчки вроде: include $(ERL_TOP)/make/target.mk include $(ERL_TOP)/make/$(TARGET)/otp.mk include $(ERL_TOP)/make/otp_subdir.mk Через несколько уровней вызовов этих мейкфайлов из $(ERL_TOP)/make/, которые там что-то у себя внутри детектят, дефайнят и в зависимости от этого принимают какие-то решения, в итоге каким-то образом управление передается в Makefile.in, лежащий в той же директории, тоже не генерящийся. Масла в огонь подливает то, что по сути там не 1 проект, а под сотню разных проектов, вложенных друг в друга. В некоторых местах иерархии есть свой корень, свой собственный configure и там целое отдельное приложение, библиотека или статический object >> 3. Проблемы в #10657 побеждены посредством -fno-stack-protector, как в >> Ubuntu. > > На первом этапе это логичное решение, но потом придётся найти что-то > получше. Чем дальше я копаюсь с erlang - тем больше убеждаюсь в том, что это такое нечто, которое проще как-то собрать, забыть и не трогать, пока не сломается что-то критичное. По хорошему - там надо бы начинать с полной перестройки всей системы сборки, его раскладывания файлов (которое абсолютно не соответствует идеологии FHS) и т.п. На Erlang, насколько я понял, есть целых 2 приложения для простых смертных в этом мире: ejabberd (xmpp-сервер) и yaws (http-сервер). Остальное - огромная куча какого-то проприетарного и очень специфичного софта для телефонии имени самого Ericson'а и т.п. >> 4. Сама сборка пестрит большим количеством warning'ов об undefined >> symbol в verify-elf (потому что там масса .so-шек, подгружаются >> виртуальной машиной на лету, как плагины) и одним TEXTREL'ом в районе >> сборки с openssl - оно у нас там уже давно стоит на relaxed. > > Во что превращается этот TEXTREL на x86-64? Пока еще не добрался. >> 5. Есть проблема со сборкой erl_interface - это некий компонент erlang >> (интерфейс к C), без которого он работать теоретически может, но >> ejabberd без него не соберется. >> >> Я подозреваю, что проблема в --as-needed и порядке линковки. На других >> системах (Fedora, BSD, Debian), люди говорят, что все собирается. Кусок >> лога: >> >> gcc -pipe -Wall -O2 -march=i586 -mtune=i686 -fno-stack-protector -Wall >> -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations >> -Wnested-externs -Winline -fno-strict-aliasing -I. -I../include >> -Iconnect -Iencode -Idecode -Imisc -Iepmd -Iregistry -Ii686-pc-linux-gnu >> -Ilegacy -o >> /home/greycat/RPM/BUILD/otp_src_R11B-3/lib/erl_interface/bin/i686-pc-linux-gnu/erl_call >> prog/erl_call.c prog/erl_start.c \ >> >> -L/home/greycat/RPM/BUILD/otp_src_R11B-3/lib/erl_interface/obj/i686-pc-linux-gnu >> -lei -lrt -lresolv -lnsl >> /tmp/.private/greycat/ccawXslX.o: In function `main': >> erl_call.c:(.text+0x1994): undefined reference to `__erl_errno' >> /home/greycat/RPM/BUILD/otp_src_R11B-3/lib/erl_interface/obj/i686-pc-linux-gnu/libei.a(ei_connect.o): >> In function `ei_do_receive_msg': >> ei_connect.c:(.text+0x2d6): undefined reference to `__erl_errno' >> ei_connect.c:(.text+0x319): undefined reference to `__erl_errno' >> ei_connect.c:(.text+0x331): undefined reference to `__erl_errno' > > Так и есть, libei.a не слинковано с тем, что содержит определение > символа __erl_errno. > >> Подскажите, что тут можно проверить и куда смотреть? > > Посмотреть в лог сборки libei.a -- скорее всего там неправильный порядок > линкуемых библиотек или даже просто нет нужной линкуемой библиотеки. Понятно, спасибо. libei.a собирается вполне обычным способом из следующих objects в таком порядке: > ei_connect.o ei_resolve.o eirecv.o send.o send_exit.o send_reg.o decode_atom.o decode_big.o decode_bignum.o decode_binary.o decode_boolean.o decode_char.o decode_double.o decode_fun.o decode_intlist.o decode_list_header.o decode_long.o decode_pid.o decode_port.o decode_ref.o decode_skip.o decode_string.o decode_trace.o decode_tuple_header.o decode_ulong.o decode_version.o decode_longlong.o decode_ulonglong.o encode_atom.o encode_bignum.o encode_binary.o encode_boolean.o encode_char.o encode_double.o encode_fun.o encode_list_header.o encode_long.o encode_pid.o encode_port.o encode_ref.o encode_string.o encode_trace.o encode_tuple_header.o encode_ulong.o encode_version.o encode_longlong.o encode_ulonglong.o epmd_port.o epmd_publish.o epmd_unpublish.o ei_decode_term.o ei_format.o ei_locking.o ei_malloc.o ei_portio.o ei_printterm.o > ei_pthreads.o ei_trace.o ei_x_encode.o eimd5.o get_type.o show_msg.o ei_compat.o hash_dohash.o hash_foreach.o hash_freetab.o hash_insert.o hash_isprime.o hash_lookup.o hash_newtab.o hash_remove.o hash_resize.o hash_rlookup.o reg_close.o reg_delete.o reg_dirty.o reg_dump.o reg_free.o reg_get.o reg_getf.o reg_geti.o reg_getp.o reg_gets.o reg_make.o reg_open.o reg_purge.o reg_resize.o reg_restore.o reg_set.o reg_setf.o reg_seti.o reg_setp.o reg_sets.o reg_stat.o reg_tabstat.o Значком ">" я отметил интересующие нас сейчас objects. Определяться __erl_errno должна по идее в ei_pthreads.o, а используется в ei_connect.o. Только здесь какая-то ерунда получается: если посмотреть в ei.h, то там эта переменная определена как: #if defined(_REENTRANT) || defined(VXWORKS) || defined(__WIN32__) /* 'erl_errno' as a function return value */ volatile int* __erl_errno_place(void) __attribute__ ((__const__)); #define erl_errno (*__erl_errno_place ()) #else /* !_REENTRANT && !VXWORKS && !__WIN32__ */ extern volatile int __erl_errno; #define erl_errno __erl_errno #endif /* !_REENTRANT && !VXWORKS && !__WIN32__ */ Насколько я понял - _REENTRANT - это какой-то флаг-характеристика системы. Не знаю, должен он быть установлен он у нас или нет и за что отвечает (гугл однозначного ответа на этот вопрос не дает), но, в данном случае, насколько я проверил - не установлен. В итоге у нас есть простое определение переменной и просто алиас на нее: extern volatile int __erl_errno; #define erl_errno __erl_errno В ei_pthreads.c же, где по идее и должно быть реальное объявление (без extern) этой переменной, есть 2 варианта ее определения: 1. volatile __declspec(thread) int __erl_errno = 0; 2. static volatile int __erl_errno; Вариант 1 засунут под ifdef __WIN32__, вариант 2 - под ifdef VXWORKS. У нас, очевидно, ни один из них. В итоге что получается, когда есть extern, но нет реально объявленной переменной? К коду ei_connect.c претензий нет - там все достаточно чисто - используется именно erl_errno, запрос к __erl_errno получается именно из-за дефайна. Видимо, на всех тех машинах, где Erlang собирается под Linux/BSD, стоит этот _REENTRANT => нет такого понятия, как __erl_errno вообще? Есть какие-то мысли, как это правильно исправить? Все упирается, видимо, в то, что такое дефайн _REENTRANT, почему у нас его нет и что сломается от того, если я его определю? Плюс, после того, как разберемся с этим вопросом, ei_pthreads.o и ei_connect.o в порядке линковки надо поменять местами, я правильно понимаю? -- WBR, Mikhail Yakshin AKA GreyCat ALT Linux [http://www.altlinux.ru] [xmpp:greycat@altlinux.org]
next prev parent reply other threads:[~2007-02-11 20:24 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2007-02-10 19:47 Mikhail Yakshin 2007-02-10 19:50 ` Michael Shigorin 2007-02-10 19:59 ` Mikhail Yakshin 2007-02-10 20:18 ` Sergey Vlasov 2007-02-10 20:21 ` Sergey Vlasov 2007-02-10 20:23 ` Dmitry V. Levin 2007-02-11 20:24 ` Mikhail Yakshin [this message] 2007-02-11 21:33 ` Dmitry V. Levin 2007-02-11 2:17 ` Alexey Borovskoy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=45CF7B69.10802@altlinux.org \ --to=greycat@altlinux.org \ --cc=devel@lists.altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git