Nie można wydrukować liczb zmiennoprzecinkowych z wykonywalnej biblioteki współdzielonej
Tworzę bibliotekę współdzieloną, która może być wykonywana niezależnie, aby wydrukować swój własny numer wersji.
Zdefiniowałem niestandardowy punkt wejścia jako:
const char my_interp[] __attribute__((section(".interp"))) = "/lib64/ld-linux-x86-64.so.2";
void my_main() {
printf("VERSION: %d\n", 0);
_exit(0);
}
i kompiluję się z
gcc -o list.os -c -g -Wall -fPIC list.c
gcc -o liblist.so -g -Wl,-e,my_main -shared list.os -lc
Ten kodkompiluje ibiegnie doskonale.
Moim problemem jest zmiana parametru printf na zmiennoprzecinkowy lub podwójny (% f lub% lf). Biblioteka następnie skompiluje się, alesegfault kiedy biegnie.
Czy ktoś ma jakieś pomysły?
edytuj1:
Oto kod, który segfaultuje:
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);
}
edytuj2:
Dodatkowe szczegóły dotyczące środowiska:
uname -a
Linux mjolnir.site 3.1.10-1.16-desktop # 1 SMP PREEMPT Wed Jun 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
Skonfigurowany dla x86_64-suse-linux. Kompilowany przez GNU CC w wersji 4.6.2. Skompilowany w systemie Linux 3.1.0 w dniu 2012-03-30.
edytuj 3:
Dane wyjściowe w / var / log / messages po segfault:
11 sierpnia 08:27:45 jądro mjolnir: [10560.068741] liblist.so [11222] ochrona ogólna ip: 7fc2b3cb2314 sp: 7fff4f5c7de8 błąd: 0 w libc-2.14.1.so [7fc2b3c63000 + 187000]