LINUX.ORG.RU

[wine] Помогите сравнить два libwine.so

 


0

0

Предыстория

Есть одна виндовозная игра(Touhou 7.5 IaMP), на неё есть рантайм-патч (экзешник тоже), который англофицирует её на ходу. (Но, суть не об этом, поэтому не надо переносить это в Games)

Недавно обнаружил что патчер начал помирать и вываливаться бактрейс. Судя по моим старым тестам, патчер работал под вайном 1.1.13. Я собрал его(старый вайн), запустил. Не пашет =(

На счастливый случай у меня остался собранный бинарный пакет этого вайна. После его установки я с удивлением обнаружил что патчер теперь работает...

Я стал играться с ldd и LD_PRELOAD...

В итоге выяснил что всё упёрлось в библиотеку libwine.so Это подтвержает тот факт, что если запустить

LD_PRELOAD=старый_libwine.so новый_wine игра.exe
(под новым подразумевается wine-1.1.13, но собранный мною недавно)

то патчер запускается, а если без LD_PRELOAD то уже нет. Тоесть старая библиотека «нормальная» а новая - нет.

Вопрос

В связи с этим появилась мысль что проблема кроется в том, чем и как эта библиотека(libwine.so) собиралась.

  • Я выяснил из логов, что старый вайн был собран GCC-4.1.2 а новый уже GCC-4.3.2. Переключился на старый, пересобрал - не помогает
  • Набор динамических библиотек у обеих библиотек одинаковый: linux-gate.so.1 libdl.so.2 libc.so.6 /lib/ld-linux.so.2
  • CFLAGS, CHOST, MAKEOPTS и USE флаги у них одинаковые.
  • В обоих случаях был одинаковый baselayout (тоесть ld, as и др. утилиты)

И теперь вопрос: как ещё можно сравнить эти библиотеки и выяснить почему при казалось бы одинаковом окружении и одинаковой версии они ведут себя по-разному?

Дистр - Генту 32битная

★★★★★

Чтобы усложнить тебе задачу, скажу, что если, например, libc требуется библиотеке A и та же libc требуется библиотеке B, то это ещё не значит что им нужна одна и та же libc. В Linux реализована версионность символов, причем libc содержит тучу символов разных версий, т.е. программа A может хотеть функцию F версии 1, в то время как программв B может брать оттуда функцию F версии 2, причем это будут совершенно разные функции.

gena2x ★★★
()

Луна была в полном доме, а марс противостоял юпитеру. Окружение не обновлялось? Что-то помимо baselayout и toolchain, от чего мог зависеть вайн.

PS В последних версиях тохо не уходит в безумие при потере фокуса окна?

tensai_cirno ★★★★★
()
Ответ на: комментарий от gena2x

>Чтобы усложнить тебе задачу, скажу, что если, например, libc требуется библиотеке A и та же libc требуется библиотеке B, то это ещё не значит что им нужна одна и та же libc. В Linux реализована версионность символов, причем libc содержит тучу символов разных версий, т.е. программа A может хотеть функцию F версии 1, в то время как программв B может брать оттуда функцию F версии 2, причем это будут совершенно разные функции.

Судя по выводу ldd -v, как на libwine, так и на wine, все версии символов одинаковы.

Nao ★★★★★
() автор топика
Ответ на: комментарий от tensai_cirno

>Луна была в полном доме, а марс противостоял юпитеру. Окружение не обновлялось? Что-то помимо baselayout и toolchain, от чего мог зависеть вайн.

Да у вайна куча зависимостей, ессно что-то обновилось, но вот только в проблемной библиотеке (libwine) в зависимостях (судя по ldd) только glibc, которое не обновлялось.

Вот к примеру выхлоп ldd для "старой" libwine:
---------------------------------------8<---------------------------------------
nao@nao /store/games/IaMP  $ ldd -v /tmp/wine-1.1.13/usr/bin/../lib/libwine.so.1 
	linux-gate.so.1 =>  (0xffffe000)
	libdl.so.2 => /lib/libdl.so.2 (0xb7db4000)
	libc.so.6 => /lib/libc.so.6 (0xb7c74000)
	/lib/ld-linux.so.2 (0xb7f13000)

	Version information:
	/tmp/wine-1.1.13/usr/bin/../lib/libwine.so.1:
		libdl.so.2 (GLIBC_2.1) => /lib/libdl.so.2
		libdl.so.2 (GLIBC_2.0) => /lib/libdl.so.2
		libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
		libc.so.6 (GLIBC_2.3) => /lib/libc.so.6
		libc.so.6 (GLIBC_2.2) => /lib/libc.so.6
		libc.so.6 (GLIBC_2.1) => /lib/libc.so.6
		libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
	/lib/libdl.so.2:
		ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
		libc.so.6 (GLIBC_2.1.3) => /lib/libc.so.6
		libc.so.6 (GLIBC_2.1) => /lib/libc.so.6
		libc.so.6 (GLIBC_2.0) => /lib/libc.so.6
		libc.so.6 (GLIBC_PRIVATE) => /lib/libc.so.6
	/lib/libc.so.6:
		ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
		ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
		ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
--------------------------------------->8---------------------------------------

У "старой" всё тоже самое, за исключенем адресов в скобочках (например 0xb7db4000)

Nao ★★★★★
() автор топика

>как ещё можно сравнить эти библиотеки

Где-то пробегала статья на тему "как патчить ядро на ходу". Там они сравнивали 2 бинарника и находили, какие ф-ии нужно поменять, чтобы заработало по новому. IMO довольно похожая задача.

DonkeyHot ★★★★★
()
Ответ на: комментарий от Nao

А с тохо как? Все также бесится при потере фокуса? Надоело vn гонять :)

tensai_cirno ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.