* Re: [sisyphus] связывание в ar
2002-10-31 18:34 [sisyphus] связывание в ar Alexey Morozov
@ 2002-10-31 16:50 ` Sergey Vlasov
2002-10-31 17:04 ` Denis S. Filimonov
1 sibling, 0 replies; 3+ messages in thread
From: Sergey Vlasov @ 2002-10-31 16:50 UTC (permalink / raw)
To: sisyphus
On Fri, 1 Nov 2002 00:34:58 +0600
Alexey Morozov <morozov@novosoft.ru> wrote:
> Небольшое расследование показало, что причиной неверной сборки является
> /неправильный/ порядок указания библиотек. То есть, если libtest29b.a
> поставить перед libtest29a.a, то все слинкуется нормально.
>
> По-моему, это бага (хотя бы из соображений использования cross-linked
> библиотек внутри некоторого проекта).
Все здесь правильно - надо внимательно читать info ld, где написано,
что компоновка идет в один проход. Поэтому порядок библиотек важен.
Если имеются неустранимые циклические зависимости - можно применить
опции -( и -).
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [sisyphus] связывание в ar
2002-10-31 18:34 [sisyphus] связывание в ar Alexey Morozov
2002-10-31 16:50 ` Sergey Vlasov
@ 2002-10-31 17:04 ` Denis S. Filimonov
1 sibling, 0 replies; 3+ messages in thread
From: Denis S. Filimonov @ 2002-10-31 17:04 UTC (permalink / raw)
To: sisyphus
1 Ноябрь 2002 00:34, Alexey Morozov написал:
> c++ -o test29 test29.o libtest29a.a libtest29b.a
>
> то нас ждет... э-э-э, разочарование:
> alex@pyro alex/tmp/c++ $ c++ -o test29 test29.o libtest29a.a libtest29b.a
> libtest29b.a(test29b.o): In function `singleton::get()':
> test29b.o(.gnu.linkonce.t._ZN9singleton3getEv+0x2d): undefined reference to
> `singleton::s' collect2: ld returned 1 exit status
> alex@pyro alex/tmp/c++ $ _
>
> Небольшое расследование показало, что причиной неверной сборки является
> /неправильный/ порядок указания библиотек. То есть, если libtest29b.a
> поставить перед libtest29a.a, то все слинкуется нормально.
>
> По-моему, это бага (хотя бы из соображений использования cross-linked
> библиотек внутри некоторого проекта).
>
> и ar, и ld из комплекта binutils-2.13.90.0.4-alt1
>
> Что скажут ведущие си- и плюсоводы?
да вроде как ld всегда так поступал.
линкуя очередную библиотеку, он проверяет совпадения между библиотечной таблицей экспорта и уже созданной таблицей неотрезолвленых символов,
но не проверяет наличие импортируемых этой библиотекой символов в общей таблице экспортируемых символов (от всех предыдущих библиотек).
таким образом, если A зависит от B, gcc ... A.a B.a слинкуется, а gcc ... B.a A.a -- нет.
при перекрестной зависимости библиотеки линкуются два раза: gcc ... A.a B.a A.a
то же самое с .so
>
> _______________________________________________
> Sisyphus mailing list
> Sisyphus@altlinux.ru
> http://altlinux.ru/mailman/listinfo/sisyphus
--
If computers take over (which seems to be their natural tendency), it will
serve us right.
-- Alistair Cooke
^ permalink raw reply [flat|nested] 3+ messages in thread
* [sisyphus] связывание в ar
@ 2002-10-31 18:34 Alexey Morozov
2002-10-31 16:50 ` Sergey Vlasov
2002-10-31 17:04 ` Denis S. Filimonov
0 siblings, 2 replies; 3+ messages in thread
From: Alexey Morozov @ 2002-10-31 18:34 UTC (permalink / raw)
To: Sisyphus mailing list
Что-то я туплю не по-детски... То ли я дурак, то ли лыжи не едут...
Итак, в задаче дано:
-------- test29a.h -------
#ifndef __test29a_h
#define __test29a_h
#include <iostream>
using namespace std;
class singleton {
static singleton s;
singleton() { cout << __PRETTY_FUNCTION__ << endl; }
public:
static singleton& get()
{
cout << __PRETTY_FUNCTION__ << endl;
return s;
}
void run()
{
cout << __PRETTY_FUNCTION__ << endl;
}
};
#endif /* __test29a_h */
--------- test29a.h -----------
--------- test29a.cc -----------
#include "test29a.h"
singleton singleton::s;
--------- test29a.cc -----------
--------- test29b.h -----------
#ifndef __test29b_h
#define __test29b_h
#include <iostream>
using namespace std;
class A {
public:
A() {cout << __PRETTY_FUNCTION__ << endl;};
void run();
};
#endif
-------- test29b.h ------------
-------- test29b.cc -----------
#include "test29b.h"
#include "test29a.h"
void A::run(void)
{
cout << __PRETTY_FUNCTION__ << endl;
singleton& s = singleton::get();
s.run();
-------- test29b.cc -----------
-------- test29.cc ------------
include "test29b.h"
int main(void)
{
A a;
a.run();
}
------- test29.cc ------------
Как видите, все довольно просто. Имеется класс singleton и пользующийся
им класс A. Экземпляр класса A, в свою очередь инстанциируется в main.
Все, вроде бы, законно. Более того, после
for i in test29.cc test29a.cc test29b.cc; do c++ -c $i; done
c++ -o test29 test29.o test29a.o test29b.o
мы получаем вполне работоспособный бинарник. Однако, если мы после компиляции
сделаем
ar cru libtest29a.a test29a.o
ar cru libtest29b.a test29b.o
а затем
c++ -o test29 test29.o libtest29a.a libtest29b.a
то нас ждет... э-э-э, разочарование:
alex@pyro alex/tmp/c++ $ c++ -o test29 test29.o libtest29a.a libtest29b.a
libtest29b.a(test29b.o): In function `singleton::get()':
test29b.o(.gnu.linkonce.t._ZN9singleton3getEv+0x2d): undefined reference to `singleton::s'
collect2: ld returned 1 exit status
alex@pyro alex/tmp/c++ $ _
Небольшое расследование показало, что причиной неверной сборки является
/неправильный/ порядок указания библиотек. То есть, если libtest29b.a
поставить перед libtest29a.a, то все слинкуется нормально.
По-моему, это бага (хотя бы из соображений использования cross-linked
библиотек внутри некоторого проекта).
и ar, и ld из комплекта binutils-2.13.90.0.4-alt1
Что скажут ведущие си- и плюсоводы?
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2002-10-31 18:34 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-31 18:34 [sisyphus] связывание в ar Alexey Morozov
2002-10-31 16:50 ` Sergey Vlasov
2002-10-31 17:04 ` Denis S. Filimonov
ALT Linux Sisyphus discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/sisyphus/0 sisyphus/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 sisyphus sisyphus/ http://lore.altlinux.org/sisyphus \
sisyphus@altlinux.ru sisyphus@altlinux.org sisyphus@lists.altlinux.org sisyphus@lists.altlinux.ru sisyphus@lists.altlinux.com sisyphus@linuxteam.iplabs.ru sisyphus@list.linux-os.ru
public-inbox-index sisyphus
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.sisyphus
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git