【发布时间】:2012-08-08 09:22:45
【问题描述】:
我正在开发一个共享库,可以独立执行以打印它自己的版本号。
我已将自定义入口点定义为:
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)时。然后库将编译,但运行时segfault。
有人有什么想法吗?
edit1:
这是段错误的代码:
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 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 错误:0 in libc-2.14.1.so[7fc2b3c63000+187000]
【问题讨论】:
-
这在我的 32 位机器上完美运行。它也应该在 64 位上工作。你是否包含了
和 ? -
@TOC 我做到了。您是否尝试打印浮点数作为版本号?我发布的代码工作正常,除了打印浮点数。
-
你能显示打印浮动的代码吗?
-
@kobrien:是的,代码在 Linux(32 位)上可以正常工作,用于浮点和双精度
-
“重新创建 /dev/null 作为解决方案”?我完全不明白。
标签: c linux gcc shared-libraries