Автор Гілка: Лінкування в linux, бібліотек створених FreeBSD  (Прочитано 5512 раз)

dusoft

  • Гість
Є программа, її вихідні коди, і статичні бібліотеки необхідні для роботи цієї програми. Все це робилося для роботи під FreeBSD, під нею воно все і працює. Виникла необхідність портувати все це на linux, але при лінкуванні з цими бібліотеками маємо такий результат:

/home/dusoft/work/sklad/skladlib/lib/libsite-engine.a(site-engine.o)(.text+0x57a
): In function `site_engine_process':
: undefined reference to `__stdoutp'
/home/dusoft/work/sklad/skladlib/lib/libsite-engine.a(site-engine.o)(.text+0x789
): In function `site_engine_set_header':
: undefined reference to `__stdoutp'
/home/dusoft/work/sklad/skladlib/lib/libsite-engine.a(site-engine.o)(.text+0x7c1
): In function `site_engine_set_body':
: undefined reference to `__stdoutp'
/home/dusoft/work/sklad/skladlib/lib/libinet.a(cookie.o)(.text+0xd11): In functi
on `__maskrune':
: undefined reference to `___runetype'
/home/dusoft/work/sklad/skladlib/lib/libinet.a(cookie.o)(.text+0xd22): In functi
on `__maskrune':
: undefined reference to `_CurrentRuneLocale'
/home/dusoft/work/sklad/skladlib/lib/libinet.a(message.o)(.text+0x158d): In func
tion `__toupper':
: undefined reference to `___toupper'
/home/dusoft/work/sklad/skladlib/lib/libinet.a(message.o)(.text+0x159a): In func
tion `__toupper':
: undefined reference to `_CurrentRuneLocale'
/home/dusoft/work/sklad/skladlib/lib/libinet.a(message.o)(.text+0x15d5): In func
tion `__tolower':
: undefined reference to `___tolower'
/home/dusoft/work/sklad/skladlib/lib/libinet.a(message.o)(.text+0x15e2): In func
tion `__tolower':
: undefined reference to `_CurrentRuneLocale'
/home/dusoft/work/sklad/skladlib/lib/libtempl.a(templ.o)(.text+0x3cc9): In funct
ion `__maskrune':
: undefined reference to `___runetype'

І так далі.
Під FreeBSD, як я подивився в libc, ці символи(чи як правильно це називати, фунції по суті..) є, а в linux'і - немає. Що можна з цим зробити?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Перекомпілювати бібліотеки?
Лінукс нікому не обіцяє двійкової сумісності.
[Fedora Linux]

dusoft

  • Гість
Перекомпілювати нема з чого. Є вихідні коди програми, ця програма використовує деякі функції які є в тих бібліотеках, а вихідних кодів тих бібліотек немає.

Взагалі-то я думав що ELF - він так би мовити і в Африці ELF.. Чи без FreeBSD мені не обійтися?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Перекомпілювати нема з чого. Є вихідні коди програми, ця програма використовує деякі функції які є в тих бібліотеках, а вихідних кодів тих бібліотек немає.

Взагалі-то я думав що ELF - він так би мовити і в Африці ELF.. Чи без FreeBSD мені не обійтися?

Назви системних функцій інші. Наприклад stdout у FreeBSD описаний так:

extern FILE *__stdoutp;
#define      stdout      __stdoutp

А у Linux так:

extern struct _IO_FILE *stdout;         /* Standard output stream.  */
Тобто код скомпільований у FreeBSD ніколи не знайде __stdoutp у Linux без перекомпіляції чи якоїсь додаткової бібліотеки. А якщо і знайде, то структура __sFILE з FreeBSD має інакший опис ніж структура _IO_FILE з Linux і програма шукатиме дані за іншими адресами.
[Fedora Linux]

dusoft

  • Гість
Цитата
Назви системних функцій інші. Наприклад stdout у FreeBSD описаний так:

extern FILE *__stdoutp;
#define      stdout      __stdoutp

А у Linux так:

extern struct _IO_FILE *stdout;         /* Standard output stream.  */
Тобто код скомпільований у FreeBSD ніколи не знайде __stdoutp у Linux без перекомпіляції чи якоїсь додаткової бібліотеки. А якщо і знайде, то структура __sFILE з FreeBSD має інакший опис ніж структура _IO_FILE з Linux і програма шукатиме дані за іншими адресами.
Ось саме це я і хотів дізнатися, і всі оці функції, структури яких йому не вистачає, знаходяться в FreeBSD'шному glibc. Я вже все обшукав, для FreeBSD, існує linux compatibility mode, чи щось таке, тобто додаткова бібліотека libc, і все там зі світу лінакс працює, а в нас тут ситуація дещо інша.. колись давно був проект iBCS, але він підтримував тільки 2.2 ядра, і зараз його вже використовувати проблематично, і кажуть люди в інтернеті що в них нічого з ним не виходить. Ще існує проект abi-linux, ніби заснований на базі застарілого iBCS, це якісь патчі для ядра, і тільки для гілки 2.4, впринципі це не проблема, але в мене є великі сумніви щодо того чи допоможе воно в моїй ситуації. Я схиляюся до думки що єдиний вихід - це якась бібліотека сумісності, як це зроблено у FreeBSD - я шукав-шукав.. і нічого не знайшов. Виправте якщо я десь неправий.

Паралельно ще одне питання: якщо я дістану вихідні коди тих бібліотек, я зможу одразу їх скомпілювати без проблем, чи доведеться в вихідних кодах міняти назви, розбиратися і т.д.?

Дякую.

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
З імовірністю 98% - зможете скомпілювати без проблем.
[Fedora Linux]

dusoft

  • Гість
Це добре.. залишилось ще питання, чи є десь така бібліотека сумісності, як для FreeBSD?

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Звичайно що нема - можна ж просто перекомпілювати.
[Fedora Linux]

Відсутній Yaroslav Fedevych

  • Літератор
  • ******
  • дописів: 1069
  • Карма: +0/-0
  • Людина — ніщо, справа — все
Цитата
Є программа, її вихідні коди, і статичні бібліотеки необхідні для роботи цієї програми. Все це робилося для роботи під FreeBSD, під нею воно все і працює. Виникла необхідність портувати все це на linux, але при лінкуванні з цими бібліотеками маємо такий результат:

Ті бібліотеки підозріло якось не подібні на статичні, або я щось не в'їхав.

Якщо нема іншої можливості, то можна собі постворювати функції-обгортки, котрі описані як у фрішці й лінкувати з отриманим об'єктним файлом.

dusoft

  • Гість
Цитата
Звичайно що нема - можна ж просто перекомпілювати.
Якщо дадуть вихідні коди - то буде щастя.. :)

Цитата
Ті бібліотеки підозріло якось не подібні на статичні, або я щось не в'їхав.
Та може й не статичні.. я ж не дуже шурупаю в цьому... але мені завжди здавалося що бібліотеки *.so - це динамічні, а *.a - це статичні, і фактично це архіви з об'єктними файлами.

Відсутній Yaroslav Fedevych

  • Літератор
  • ******
  • дописів: 1069
  • Карма: +0/-0
  • Людина — ніщо, справа — все
Точно.

Але як не дадуть коду -- то гриземо лікті й пишемо ще один файлик .c...

dusoft

  • Гість
Коду не дали, але скомпілювали ці бібліотеки для лінаксу.