LINUX.ORG.RU

Два объектных файла, один определяет функцию, а второй её использует. Статическая библиотека это же набор объектных файлов и тот же nm просто отображает символы от каждого из них. Если распаковать, можно убедится дополнительно.

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

Характерно, что после линковки в целевой бинарь - ситуация не пропадает. Т.е. в so'хе или в эльфе остаётся два исходных символа.

И тот же ldd -r на них ругается.

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

Если не в статической библиотеке, то повторить не удаётся. Пример бы, который можно поковырять локально. Не получится такой сделать?

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

Был бы пример - я бы наверное сам разобрался :)

Непонятно как так выходит.

А кодебейз большой и не мой.

Но я прогнал - в итоговом бинаре, остаётся один символ, и он U.

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

Не удаётся повторить не в статической, а можешь дать сорцы для статической, где повторяется?

pon4ik ★★★★★
() автор топика

U - значит, что символ Undefined.
T - значит, что символ соответствует коду из секции text.

Походу один файл в архиве определяет символ, а второй его юзает.

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

Уж про значения буковок то я вроде как в курсе :)

Похоже. Уже товарисч сверху отписал.

Однако после линковки такой статик либы, в динамическую, символ детектается как U.

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

Чтобы сказать больше, надо бы видеть как єта ф-я обьявлена, как заимплеменчена, и как все линкуется в шареную либу.

Возможно ошибка в видимости символа, но без доп инфы єто не более чем догадка.

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

Спасибо. Попробую поиграться как у компа окажусь.

pon4ik ★★★★★
() автор топика

$ cat a.h

namespace my_ns {

struct A {
    void foo ();
};

};

$ cat a.cc

#include "a.h"

void my_ns::A::foo()
{
}

$ cat b.cc

#include "a.h"

void bar()
{
    my_ns::A a;
    a.foo();
}

$ c++ -c a.cc
$ c++ -c b.cc
$ ar -rcs ar.a a.o b.o

$ nm ar.a 

ar.a(a.o):
0000000000000000 T __ZN5my_ns1A3fooEv

ar.a(b.o):
0000000000000000 T __Z3barv
                 U __ZN5my_ns1A3fooEv
asaw ★★★★★
()

Спасибо всем отписавшимся.

Косяк был в порядке линковки статических либ. Либа со ссылкой на символ должна линковаться до, либы с его определением.

pon4ik ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.