Я разрабатываю общую библиотеку, которая может быть выполнена независимо, чтобы напечатать собственный номер версии.
Я определил пользовательскую точку входа как:
const char my_interp[] __attribute__((section(".interp"))) = "/lib64/ld-linux-x86-64.so.2";
void my_main() {
printf("VERSION: %d\n", 0);
_exit(0);
}
и скомпилировать с помощью
gcc -o list.os -c -g -Wall -fPIC list.c
gcc -o liblist.so -g -Wl,-e,my_main -shared list.os -lc
Этот код компилирует и работает отлично.
Моя проблема в том, что я изменяю параметр printf как float или double (% f или% lf). Затем библиотека будет компилироваться, но segfault при запуске.
У кого-нибудь есть идеи?
edit1:
Вот код, который segfaults:
const char my_interp[] __attribute__((section(".interp"))) = "/lib64/ld-linux-x86-64.so.2";
void my_main() {
printf("VERSION: %f\n", 0.1f);
_exit(0);
}
edit2:
Дополнительные экологические детали:
uname -a
Linux mjolnir.site 3.1.10-1.16-desktop # 1 SMP PREEMPT Ср июн 27 05:21:40 UTC 2012 (d016078) x86_64 x86_64 x86_64 GNU/Linux
gcc --version
gcc (SUSE Linux) 4.6.2
/lib64/libc.so.6
Конфигурируется для x86_64-suse-linux. Составлено GNU CC версии 4.6.2. Скомпилирован в Linux 3.1.0 в 2012-03-30.
изменить 3:
Вывод в/var/log/сообщения по segfault:
11 августа 08:27:45 mjolnir kernel: [10560.068741] liblist.so [11222] общая защита ip: 7fc2b3cb2314 sp: 7fff4f5c7de8 error: 0 в libc-2.14.1.so [7fc2b3c63000 + 187000]