Zajmuję się udostępnianiem biblioteki, która może być wykonywana niezależnie, aby wydrukować własny numer wersji.Nie można wydrukowaćf liczby zmiennoprzecinkowe z wykonywalnej biblioteki współdzielonej
Mam zdefiniowano 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 skompilować 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 kod kompiluje i biegnie doskonale.
Mój problem dotyczy zmiany parametru printf na float lub double (% f lub% lf). Biblioteka będzie następnie kompilować, ale segfault po uruchomieniu.
Ktoś ma jakieś pomysły?
Edit1:
Oto kod, który zwraca błąd:
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:
Dodatkowe informacje środowiskowe:
uname -a
Linux mjolnir.site 3.1.10-1.16-desktop # 1 SMP PREEMPT śro 27 czerwca 2012 05:21:40 UTC (d016078) x86_64 x86_64 x86_64 GNU/Linux
gcc --version
gcc (SUSE Linux) 4.6.2
/lib64/libc.so.6
Skonfigurowano dla x86_64-suse-linux. Skompilowany przez GNU CC w wersji 4.6.2. Skompilowany w systemie Linux 3.1.0 w dniu 2012-03-30.
edit 3:
wyjścia w/var/log/messages upon segfault:
11 sierpnia jądro 08:27:45 Mjolnir: [+10560,068741] liblist.so [11222] ogólnym ochrona ip: 7fc2b3cb2314 sp: błąd 7fff4f5c7de8: 0 w bibliotece libc-2.14.1.so [7fc2b3c63000 + 187000]
Działa to doskonale na mojej maszynie 32-bitowej. I powinno działać również na 64 bitach. czy podałeś i ? –
TOC
@ TOC Zrobiłem. Czy próbowałeś wydrukować liczbę zmiennoprzecinkową jako numer wersji? Kod, który wysłałem, działa dobrze, z wyjątkiem sytuacji, gdy drukujesz float. – kobrien
Czy możesz pokazać kod, który drukuje float? –