On Sun, Aug 13, 2006 at 04:20:44PM +0400, Alexey Tourbin wrote: > Я и говорю: если удалить старый интерфейс полностью, то будет анмет. Тогда чем это лучше смены soname? Вообще у меня сейчас получилось вот что: #define symver_concat(pre, post) pre##post #define symver_tmp_name(name, line) symver_concat(name##_version_, line) #define symver_set_weak(real) \ __asm__ (".weak " #real); \ __asm__ (".weak ." #real) #define symver_define_alias(alias, name) \ extern __typeof__ (name) alias __attribute__((__alias__(#name))) #define symver_set_version(real, name, version) \ __asm__ (".symver " #real "," #name "@" version); \ __asm__ (".symver ." #real ",." #name "@" version) #define symver_declare_version(alias, name, version) \ symver_define_alias(alias, name); \ symver_set_version(alias, name, version) #define symbol_version(name, version) \ symver_declare_version(symver_tmp_name(name, __LINE__), \ name, #version) #define symbol_default_version(name, version) \ symver_set_weak(name); \ symver_declare_version(symver_tmp_name(name, __LINE__), \ name, "@" #version) Используется как-то так: symbol_default_version(junk, JUNK_1.1); symbol_version(junk, JUNK_1.0); При этом в map-файле всё равно приходится писать все символы во всех версиях: JUNK_1.0 { global: junk; local: *; }; JUNK_1.1 { global: junk; } JUNK_1.0; Использование ".weak" позволяет не менять основной код, где экспортируемые функции просто определяются как глобальные (без ".weak" получается конфликт из-за того, что версия с "@@" генерирует фактически полноценное определение символа). Символы с ".", предположительно нужные на powerpc64, вроде бы не мешают и на i586.