В попытке получить "Steam для Linux", работающий над Debian, я столкнулся с проблемой. libcef
(Chromium Embedded Framework) отлично работает с GLIBC_2.13
(который может предоставить eglibc при тестировании Debian), но требует от пользователя GLIBC_2.15
(что eglibc не может) одной дозойной дополнительной функции:
$ readelf -s libcef.so | grep -E "@GLIBC_2\.1[4567]"
1037: 00000000 0 FUNC GLOBAL DEFAULT UND [email protected]_2.15 (49)
2733: 00000000 0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.15
Мой план атаки здесь состоял в LD_PRELOAD
библиотеке прокладки, которая предоставляет только эти функции. Кажется, это не работает. Я действительно хочу избежать установки GLIBC_2.17
(поскольку он находится в Debian, даже у Debian sid все еще есть GLIBC_2.13
).
Это то, что я пробовал.
fdelt_chk.c
в основном украден из библиотеки GNU C:
#include <sys/select.h>
# define strong_alias(name, aliasname) _strong_alias(name, aliasname)
# define _strong_alias(name, aliasname) \
extern __typeof (name) aliasname __attribute__ ((alias (#name)));
unsigned long int
__fdelt_chk (unsigned long int d)
{
if (d >= FD_SETSIZE)
__chk_fail ();
return d / __NFDBITS;
}
strong_alias (__fdelt_chk, __fdelt_warn)
Мой Versions
script выглядит следующим образом:
GLIBC_2.15 {
__fdelt_chk; __fdelt_warn;
};
Затем я создаю библиотеку следующим образом:
$ gcc -m32 -c -fPIC fdelt_chk.c -o fdelt_chk.o
$ gcc -m32 -shared -nostartfiles -Wl,-s -Wl,--version-script Versions -o fdelt_chk.so fdelt_chk.o
Однако, если я затем запустил Steam (с кучей дополнительных материалов, чтобы заставить его работать в первую очередь), загрузчик все же отказывается найти символ:
% LD_LIBRARY_PATH="/home/tinctorius/.local/share/Steam/ubuntu12_32" LD_PRELOAD=./fdelt_chk.so:./steamui.so ./steam
./steam: /lib/i386-linux-gnu/i686/cmov/libc.so.6: version `GLIBC_2.15' not found (required by /home/tinctorius/.local/share/Steam/ubuntu12_32/libcef.so)
Однако символ версии также предоставляется .so
только что построенным:
% readelf -s fdelt_chk.so
Symbol table '.dynsym' contains 8 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 FUNC GLOBAL DEFAULT UND [email protected]_2.3.4 (3)
2: 0000146c 0 NOTYPE GLOBAL DEFAULT ABS _edata
3: 0000146c 0 NOTYPE GLOBAL DEFAULT ABS _end
4: 00000310 44 FUNC GLOBAL DEFAULT 11 [email protected]@GLIBC_2.15
5: 00000310 44 FUNC GLOBAL DEFAULT 11 [email protected]@GLIBC_2.15
6: 00000000 0 OBJECT GLOBAL DEFAULT ABS GLIBC_2.15
7: 0000146c 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
В этот момент я не знаю, что я могу сделать, чтобы обмануть загрузчика (кто?) в выборе моих символов. Я вообще в правильном направлении?