29.05.08, Alexander Bokovoy написал(а): > >> > > > Так вот, я прав: > >> > > > 1) что нужны только символы с пометкой T? > >> > > > 2) что T _fini и T _init не нужно добавлять в version script? > >> > > Для начального списка я бы посмотрел в include-файлы. > >> > А если проект весит 10 mb? А если ещё больше? Предлагаешь читать все > >> > исходники? Зачем делать работу за nm? > >> Не все символы, полученные nm, могут быть во внешнем API. > > > > Вот я лю этом и спрашиваю. Только "T" или ещё какие-то? > > поэтому и говорят: "Смотрите в include-файлы". API определяется именно > там и различия в коде между двумя версиями могут приводить к разнице в > API даже если символы в ELF не поменялись. В частности, могут > поменяться структуры данных, которые в ELF не отражены. Понятно. > К тому же, не все публичные символы в ELF публичны с точки зрения API. Ага. Есть различная внутреняя кухня которую лучше не выставалять наружу. > В некоторых особых случаях правила использования символов, отраженных > в ABI, определены лицензией. Например, распространено использование > LGPL+ограничения по плагинам (они могут использовать только символы > официального API, в противном случае лицензия GNU GPL). > > Поэтому в любом случае нужно смотреть и анализировать реальное API для > того, чтобы делать выводы по версионированию ABI. Спасибо за советы, когда буду писать страницу на вики, надо будет это всё туда добавить. Итак, я сделал тестовый version script для libasyncns-0.3-alt2. [icesik@iceberg SOURCES]$ cat libasyncns-0.3-vers.sym LIBASYNCNS_0_3 { global: asyncns_cancel; asyncns_fd; asyncns_free; asyncns_freeaddrinfo; asyncns_getaddrinfo; asyncns_getaddrinfo_done; asyncns_getnameinfo; asyncns_getnameinfo_done; asyncns_getnext; asyncns_getnqueries; asyncns_getuserdata; asyncns_isdone; asyncns_new; asyncns_res_done; asyncns_res_query; asyncns_res_search; asyncns_setuserdata; asyncns_wait; local: *; }; [icesik@iceberg SOURCES]$ Из этого списка убраны A символы и служебные (T _fini и T _init). После сборки у libasyncns появляется новый интерфейс LIBASYNCNS_0_3 (это ведь так называется?) и новый Provides libasyncns.so.0(LIBASYNCNS_0_3). Единственное приложение которое линкуется с libasyncns pulseaudio после пересборки получает новую бинарную зависимость на libasyncns.so.0(LIBASYNCNS_0_3). Ну и вопрос, я всё правильно сделал? Если да, то я занесу это всё в вику для потомков. P.S.: нужные файлы для воспроизведение приложены. -- icesik