использование .DEF файлов под линухом
От: Graf Alex Украина http://grafalex.oberon.kiev.ua
Дата: 24.12.07 09:00
Оценка:
А можно ли при линковке .so библиотек использовать файлики аля виндовые .DEF файлы?

Мне просто нравится сам подход, что под виндой из ДЛЛки торчит 1-2 функции.... хотелось бы тоже самое под линухом... мне в принципе не жалко, что торчит вся ДЛЛка, но коль скоро проект кроссплатформенный, хотелось бы максимальной похожести...

поиск ничего не дал, кроме фраз типа "задолбали нубы, не читают маны" и самих манов... Кстати по ним видно, что теоретически ld поддерживает .DEF файлы, только под линухом эта функциональность видимо отключена...

В общем у кого какая инфа есть по этому поводу?

ЗЫ есть еще __attribute__ ((visibility("hidden"))) — но это на уровне компилера... а мне нужно эту инфу линкеру скармливать
Re: использование .DEF файлов под линухом
От: McQwerty Россия  
Дата: 24.12.07 09:37
Оценка:
Здравствуйте, Graf Alex, Вы писали:

GA>А можно ли при линковке .so библиотек использовать файлики аля виндовые .DEF файлы?


GA>Мне просто нравится сам подход, что под виндой из ДЛЛки торчит 1-2 функции.... хотелось бы тоже самое под линухом... мне в принципе не жалко, что торчит вся ДЛЛка, но коль скоро проект кроссплатформенный, хотелось бы максимальной похожести...


GA>поиск ничего не дал, кроме фраз типа "задолбали нубы, не читают маны" и самих манов... Кстати по ним видно, что теоретически ld поддерживает .DEF файлы, только под линухом эта функциональность видимо отключена...


GA>В общем у кого какая инфа есть по этому поводу?


GA>ЗЫ есть еще __attribute__ ((visibility("hidden"))) — но это на уровне компилера... а мне нужно эту инфу линкеру скармливать


Вот zaufi в своё время говорил здесь
Автор: zaufi
Дата: 19.04.07
на эту тему:

ну что тут сказать кроме банального `man ld`


Я думаю он расскажет как это делать.
Re[2]: использование .DEF файлов под линухом
От: Graf Alex Украина http://grafalex.oberon.kiev.ua
Дата: 24.12.07 10:11
Оценка:
Здравствуйте, McQwerty, Вы писали:

MQ>Здравствуйте, Graf Alex, Вы писали:


GA>>А можно ли при линковке .so библиотек использовать файлики аля виндовые .DEF файлы?


GA>>Мне просто нравится сам подход, что под виндой из ДЛЛки торчит 1-2 функции.... хотелось бы тоже самое под линухом... мне в принципе не жалко, что торчит вся ДЛЛка, но коль скоро проект кроссплатформенный, хотелось бы максимальной похожести...


GA>>поиск ничего не дал, кроме фраз типа "задолбали нубы, не читают маны" и самих манов... Кстати по ним видно, что теоретически ld поддерживает .DEF файлы, только под линухом эта функциональность видимо отключена...


GA>>В общем у кого какая инфа есть по этому поводу?


GA>>ЗЫ есть еще __attribute__ ((visibility("hidden"))) — но это на уровне компилера... а мне нужно эту инфу линкеру скармливать


MQ>Вот zaufi в своё время говорил здесь
Автор: zaufi
Дата: 19.04.07
на эту тему:

MQ>

MQ>ну что тут сказать кроме банального `man ld`


MQ>Я думаю он расскажет как это делать.

1) ссылка некорректна. Хотя бы потому, что я почти полностью разделяю взгляды г-на zaufi. К тому же это очередные священные войны — не хочу спорить. И вообще по теме кроме вышеуказаной фразы ничего больше нет.
2) ман линкера я перепахал нескольок раз в разных направлениях и разных версиях. Как я уже писал он умеет работать с .DEF файлами, но судя по всему не в линуксовой версии
3) именно это я и имел в виду под фразой "задолбали нубы". Вместо того, что бы дать хотя бы напрявляющий ответ — тупо отсылают к манам. Видимо кнопки давить облом.
4) посольку многие понятия на винде и на линухе по разному называются, просто мог не найти нужного в мане... Для того я и обратился сюда. Но вместо того, что бы ответ получить — получил посылание в... маны...
Re: использование .DEF файлов под линухом
От: Cyberax Марс  
Дата: 24.12.07 10:19
Оценка:
Здравствуйте, Graf Alex, Вы писали:

GA>В общем у кого какая инфа есть по этому поводу?

Можно, при желании сделать такое. Смотреть в направлении вот сюда: http://www.gnu.org/software/binutils/manual/ld-2.9.1/html_node/ld_25.html

Еще можно попробовать в .o-файлах менять атрибуты видимости функций (т.е. эмулировать hidden-атрибуты) с помощью скрипта.

Хотя я бы таким не занимался.
Sapienti sat!
Re[3]: использование .DEF файлов под линухом
От: McQwerty Россия  
Дата: 24.12.07 10:57
Оценка:
Здравствуйте, Graf Alex, Вы писали:

GA>>>А можно ли при линковке .so библиотек использовать файлики аля виндовые .DEF файлы?


MQ>>Вот zaufi в своё время говорил здесь
Автор: zaufi
Дата: 19.04.07
на эту тему:

MQ>>

MQ>>ну что тут сказать кроме банального `man ld`


GA>1) ссылка некорректна. Хотя бы потому, что я почти полностью разделяю взгляды г-на zaufi. К тому же это очередные священные войны — не хочу спорить. И вообще по теме кроме вышеуказаной фразы ничего больше нет.

Взгляд zaufi, который ты разделяешь, на эту проблему простой — банально читать ман. Поэтому не удивляйся, что получил
GA>4) посылание в... маны...

По теме: не экпортировать что-либо без сообщения этого компилятору нельзя. А в компиляторе — сильно уникальными средставами (читай — непереносимо). Есть также ключ --version-script, но мне не удалось заставить его работать (gcc 3.4.6) так как нужно.
Re[4]: использование .DEF файлов под линухом
От: Cyberax Марс  
Дата: 24.12.07 11:04
Оценка:
Здравствуйте, McQwerty, Вы писали:

MQ>По теме: не экпортировать что-либо без сообщения этого компилятору нельзя. А в компиляторе — сильно уникальными средставами (читай — непереносимо).

То есть? Вполне переносимо:
#ifdef _MSC_VER
  #ifdef BUILDING_DLL
    #define DLLEXPORT __declspec(dllexport)
  #else
    #define DLLEXPORT __declspec(dllimport)
  #endif
  #define DLLLOCAL
#else
  #ifdef HAVE_GCCVISIBILITYPATCH
    #define DLLEXPORT __attribute__ ((visibility("default")))
    #define DLLLOCAL __attribute__ ((visibility("hidden")))
  #else
    #define DLLEXPORT
    #define DLLLOCAL
  #endif
#endif

extern "C" DLLEXPORT void function(int a);
class DLLEXPORT SomeClass
{
   int c;
   DLLLOCAL void privateMethod();  // Only for use within this DSO
public:
   Person(int _c) : c(_c) { }
   static void foo(int a);
};
Sapienti sat!
Re[5]: использование .DEF файлов под линухом
От: McQwerty Россия  
Дата: 24.12.07 11:50
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, McQwerty, Вы писали:


MQ>>По теме: не экпортировать что-либо без сообщения этого компилятору нельзя. А в компиляторе — сильно уникальными средставами (читай — непереносимо).

C>То есть? Вполне переносимо:
C>
C>  #ifdef HAVE_GCCVISIBILITYPATCH
C>

Угу, и проблема спускается на уровень makefile: -DHAVE_GCCVISIBILITYPATCH
И иметь несколько makefile-ов по числу target-платформ.
Re[6]: использование .DEF файлов под линухом
От: Cyberax Марс  
Дата: 24.12.07 12:03
Оценка:
Здравствуйте, McQwerty, Вы писали:

MQ>Угу, и проблема спускается на уровень makefile: -DHAVE_GCCVISIBILITYPATCH

MQ>И иметь несколько makefile-ов по числу target-платформ.
Если ты используешь Autoconf — то можно просто написать тест для него. А если не используешь — все равно надо будет несколько make-файлов.
Sapienti sat!
Re[6]: использование .DEF файлов под линухом
От: Graf Alex Украина http://grafalex.oberon.kiev.ua
Дата: 24.12.07 12:06
Оценка:
Здравствуйте, McQwerty, Вы писали:

MQ>Здравствуйте, Cyberax, Вы писали:


C>>Здравствуйте, McQwerty, Вы писали:


MQ>>>По теме: не экпортировать что-либо без сообщения этого компилятору нельзя. А в компиляторе — сильно уникальными средставами (читай — непереносимо).

C>>То есть? Вполне переносимо:
C>>
C>>  #ifdef HAVE_GCCVISIBILITYPATCH
C>>

MQ>Угу, и проблема спускается на уровень makefile: -DHAVE_GCCVISIBILITYPATCH
MQ>И иметь несколько makefile-ов по числу target-платформ.
С этим проблем не будет — таргет платформ всего 2: винда и линух. В винде проекты вижуал студии, в линухе мейкфайлы.
К тому же, как я уже писал, если все функции из so-шки будут экспортироваться, то ничего страшного не произойдет. Просто хотелось подобия.
В коде пока нигде нет модификаторов export/import и вводить их мне облом (так недолго и весь проект поламать). Все регулируется .DEF файлами.


ЗЫ Визибилити это, конечно, хорошо... Я бы не спрашивал, если бы хотел так сделать... Просто интересно проблему решить линкером...
Re[2]: использование .DEF файлов под линухом
От: zaufi Земля  
Дата: 24.12.07 13:00
Оценка: 5 (2)
Здравствуйте, McQwerty, Вы писали:

MQ>Вот zaufi в своё время говорил здесь
Автор: zaufi
Дата: 19.04.07
на эту тему:

MQ>

MQ>ну что тут сказать кроме банального `man ld`


sorry, my fault... `man libtool` если быть более точным...
читаем в разделе про `link mode'

`-export-symbols SYMFILE'
Tells the linker to export only the symbols listed in SYMFILE.
The symbol file should end in `.sym' and must contain the name of
one symbol per line. This option has no effect on some platforms.
By default all symbols are exported.


`-export-symbols-regex REGEX'
Same as `-export-symbols', except that only symbols matching the
regular expression REGEX are exported. By default all symbols are
exported.


тестик:

#include <iostream>
using namespace std;

int foo()
{
    cout << __PRETTY_FUNCTION__ << endl;
    return 0;
}

int bar()
{
    cout << __PRETTY_FUNCTION__ << endl;
    return 0;
}

int foo_bar()
{
    cout << __PRETTY_FUNCTION__ << endl;
    return 0;
}


# compile
zaufi tests # libtool --mode=compile --tag=CXX g++ -c -o ldtest.o ldtest.cc
 g++ -c ldtest.cc  -fPIC -DPIC -o .libs/ldtest.o
 g++ -c ldtest.cc -o ldtest.o >/dev/null 2>&1

# link and export only functions with `foo'
zaufi tests # libtool --mode=link --tag=CXX g++ -export-symbols-regex '.*foo.*' -g -o libldtest.la -rpath /usr/local/lib ldtest.lo
rm -fr  .libs/libldtest.a .libs/libldtest.exp .libs/libldtest.la .libs/libldtest.lai .libs/libldtest.so .libs/libldtest.so.0 .libs/libldtest.so.0.0.0
generating symbol list for `libldtest.la'
/usr/bin/nm -B  .libs/ldtest.o  | sed -n -e 's/^.*[     ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[         ][      ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' | /bin/sed 's/.* //' | sort | uniq > .libs/libldtest.exp
/bin/grep -E -e ".*foo.*" ".libs/libldtest.exp" > ".libs/libldtest.expT"
mv -f ".libs/libldtest.expT" ".libs/libldtest.exp"
x86_64-pc-linux-gnu-g++ -shared -nostdlib /usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/../../../../lib64/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/crtbeginS.o  .libs/ldtest.o  -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/../../../../x86_64-pc-linux-gnu/lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/../../../../lib64/crtn.o  -Wl,-soname -Wl,libldtest.so.0 -Wl,-retain-symbols-file -Wl,.libs/libldtest.exp -o .libs/libldtest.so.0.0.0
(cd .libs && rm -f libldtest.so.0 && ln -s libldtest.so.0.0.0 libldtest.so.0)
(cd .libs && rm -f libldtest.so && ln -s libldtest.so.0.0.0 libldtest.so)
x86_64-pc-linux-gnu-ar cru .libs/libldtest.a  ldtest.o
x86_64-pc-linux-gnu-ranlib .libs/libldtest.a
creating libldtest.la
(cd .libs && rm -f libldtest.la && ln -s ../libldtest.la libldtest.la)

zaufi tests # nm .libs/libldtest.so
0000000000000a3c T _Z3foov
00000000000009e0 T _Z7foo_barv
Re[3]: использование .DEF файлов под линухом
От: Graf Alex Украина http://grafalex.oberon.kiev.ua
Дата: 24.12.07 15:52
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>Здравствуйте, McQwerty, Вы писали:


MQ>>Вот zaufi в своё время говорил здесь
Автор: zaufi
Дата: 19.04.07
на эту тему:

MQ>>

MQ>>ну что тут сказать кроме банального `man ld`


Z>sorry, my fault... `man libtool` если быть более точным...

Z>читаем в разделе про `link mode'
оно... спасибо!!
правда либтулом не пользуюсь... но зато подсмотрел как он это делает
Ключик -retain-symbols-file линкеру отлично хавает DEF файлы
во всяком случае наши...

ЗЫ до тех пор, пока какой то умник не назовет свою функцию EXPORTS или LIBRARY
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.