Re: Was ist ein ABI?

Philipp Thomas <[email protected]>
Newsgroups gmane.linux.suse.programming
Message-ID <[email protected]>
Am Wed, 18 Feb 2009 11:23:47 +0100 schriebst Du:

>Das die Änderung eines Types von int zu long in der Signatur auch die ABI 
>ändert ist neu:-)

Nicht zwansläufig :) Bei C++ fliesst ja der Datentyp direkt in die Namensdekoration 
ein. Mach mal ein 'objdump --demangle -T /usr/lib64/libstdc++.so.6', dann 
bekommst Du (Ausschnitt):

00067a70  w   DF .text      00000015  GLIBCXX_3.4 std::basic_ios<char, std::char_traits<char> >::operator void*() const
00054480 g    DF .text      00000016  GLIBCXX_3.4.6 std::locale::facet::_S_get_c_name()
000c48e0  w   DO .rodata 00000031  GLIBCXX_3.4 typeinfo name for std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >
0009de40  w   DF .text     0000002e  GLIBCXX_3.4 std::codecvt_byname<wchar_t, char, __mbstate_t>::~codecvt_byname()
000eb658  w   DO .bss     00000008  GLIBCXX_3.4 guard variable for std::money_get<char, std::istreambuf_iterator<char, std::char_traits<char> > >::id
000b9320 g    DF  .text     00000033  GLIBCXX_3.4.10 __gnu_parallel::_Settings::set(__gnu_parallel::_Settings&)
000970f0  w   DF  .text     00000097  GLIBCXX_3.4 std::string::compare(unsigned int, unsigned int, char const*, unsigned int) const

Wärend das Ganze undekodiert (also ohne --demangle) so aussieht:

00067a70 w   DF  .text     00000015  GLIBCXX_3.4    _ZNKSt9basic_iosIcSt11char_traitsIcEEcvPvEv
00054480 g   DF  .text     00000016  GLIBCXX_3.4.6  _ZNSt6locale5facet13_S_get_c_nameEv
000c48e0  w  DO .rodata 00000031  GLIBCXX_3.4     _ZTSSt18basic_stringstreamIcSt11char_traitsIcESaIcEE
0009de40  w  DF .text     0000002e  GLIBCXX_3.4     _ZNSt14codecvt_bynameIwc11__mbstate_tED1Ev
000eb658  w  DO .bss     00000008  GLIBCXX_3.4      _ZGVNSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE2idE
000b9320 g   DF  .text    00000033  GLIBCXX_3.4.10 _ZN14__gnu_parallel9_Settings3setERS0_
000970f0  w  DF  .text    00000097  GLIBCXX_3.4      _ZNKSs7compareEjjPKcj

Auf Architekturen wie x86-64 , wo int 32 Bit long aber 64 Bit lang ist ergibt sich auch
für C Code eine ABI-Änderung.

>Auch wenn ich immernoch der Meinung bin, das eine Änderung der Signatur eine 
>Änderung der API ist und daher so oder so neu kompiliert werden sollte...

Wie soll das aber die Applikation merken? Wenn ich eine kompilierte Applikation habe 
und nun eine neue Version der Bibliothek einspiele erwarte ich, dass diese Applikation 
nach wie vor vernünftig funktioniert. Das  aber ist (unter anderem) nur garantiert, wenn 
das ABI nicht verändert wurde.

Philipp
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.