我正在开发一个可以独立执行以打印它自己的版本号的共享库。
我已将自定义入口点定义为:
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 的参数更改为浮点数或双精度数(%f 或 %lf)时。然后该库将编译,但运行时会出现段错误。
有人有想法么?
编辑1:
这是段错误的代码:
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);
}
编辑2:
其他环境细节:
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
为 x86_64-suse-linux 配置。由 GNU CC 版本 4.6.2 编译。于 2012 年 3 月 30 日在 Linux 3.1.0 系统上编译。
编辑3:
段错误时在 /var/log/messages 中的输出:
8 月 11 日 08:27:45 mjolnir 内核:[10560.068741] liblist.so[11222] 一般保护 ip:7fc2b3cb2314 sp:7fff4f5c7de8 error:0 in libc-2.14.1.so[7fc2b3c63000+187000]