【发布时间】:2024-01-21 14:09:01
【问题描述】:
我最初的任务是安装 mod_perl 2.0.6 + Apache 2.2.22。
编译 mod_perl 时,该进程因出现与 off64_t 相关的大量错误而停止。于是,我开始深入挖掘。首先,我安装了两个新的 Perl 5.8.9 实例(因为我必须使用这个版本):一个线程版本和一个非线程版本(它们是相同的,只有 usethreads 不同)。尝试使用线程化 Perl 重现相同的内容并成功完成,并且完全没有 off64_t 错误。
结论很明显:线程化的 Perl 提供了必要的off64_t,而非线程化的则没有。
进一步搜索,我比较了两个 Perl 的 config.h(来自 core/<arch>/CORE),在第 3671 行我可以看到这个(在非线程 Perl 中):
/* HAS_OFF64_T:
* This symbol will be defined if the C compiler supports off64_t.
*/
/*#define HAS_OFF64_T / **/
在启用线程的 Perl 中:
#define HAS_OFF64_T /**/
perl -V 对于两个 Perl 实例都将 ccflags ='... -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 ...' 报告为使用的编译器标志。
据我了解,off64_t 用于大文件,与线程无关。我找到了关于off_t 和off64_t 的信息:
如果源代码使用
_FILE_OFFSET_BITS = 64编译,则此类型(即off_t)透明地替换为off64_t。
简短地说:有 2 个相同的 Perl 构建,只有一个区别:usethreads 配置参数。线程化的 Perl 启用 off64_t,非线程化的则不启用。
我的问题是:为什么会发生这种情况以及线程如何连接到应该用于大文件而不是线程的 off64_t 数据类型?
信息:Arch Linux OS 32 位(内核 2.6.33)、gcc 4.5.0、libc 2.11.1、标准 Perl 5.8.9
注意:off64_t 在第 15526 行的Configure 中处理,生成一个简单的try.c 并尝试编译。问题是为什么非线程 Perl 不能编译它而线程 Perl 可以。
【问题讨论】:
-
请说明发行版和架构
-
尝试使用 5.14.2 编译,该错误可能已经修复,因为 Linux 上的构建错误很容易被发现。 5.8.9 不再是 not supported。我看到你有相当现代的 GCC、httpd 和 mod_perl 版本,坚持使用 Perl 是没有意义的,因为没有人可能会产生解决方法或错误修复。
-
@daxim,我知道 5.8.9 不再受支持,应该使用 5.14,但我必须使用非线程 5.8.9,这就是为什么这个特殊问题影响我的原因。我只是想找出那里发生了什么以及为什么会发生这种情况。但为了完整起见,我也会尝试 5.14 并比较两个版本。
-
@daxim 为了完整起见,我还安装了一个新的非线程 (
-Uusethreads) Perl v5.14.2,它具有与off64_t完全相同的行为和相同的错误与 Apache 结合使用时变为apr_off_t错误。config.h包含相同的#define HAS_OFF64_T行注释(以及很多其他行,与线程版本相比)
标签: multithreading perl compilation large-files