4

我似乎无法在 Cygwin 1.7.11 中构建 perl 5.6.2。

到目前为止,这是我要遵循的步骤。

从网站下载 perl 5.6.2 源代码并解压到某个文件夹“perl-5.6.2”

cd perl-5.6.2/bld
sh ../Configure -des -Dmksymlinks -Dprefix=/common/ndd/perl/5.6.2 -DDEBUGGING 2>&1
make 2>&1
make install 2>&1

以下是其中的日志:

http://pastebin.com/pqLg4S7z

发生的事情是 make 创建“perl-5.6.2/bld/perl.exe”,并且该文件每次都会生成一个中止信号。

这是在其上运行 gdb 的回溯。(注意:我配置了 -DDEBUGGING,所以应该启用所有 gcc 调试标志。)

(gdb) run
Starting program: /openlogic/build/work/perl-5.6.2/bld/perl.exe
[New Thread 3348.0xf54]
[New Thread 3348.0x48c]

Program received signal SIGABRT, Aborted.
0x00000000 in ?? ()
(gdb) backtrace
#0  0x00000000 in ?? ()
#1  0x7792f8b1 in ntdll!RtlUpdateClonedSRWLock ()
   from /cygdrive/c/Windows/system32/ntdll.dll
#2  0x757f0a91 in WaitForSingleObjectEx ()
   from /cygdrive/c/Windows/syswow64/KERNELBASE.dll
#3  0x000000a8 in ?? ()
#4  0x00000000 in ?? ()
(gdb) quit

这里 ldd.exe 命令在 perl.exe 上运行

$ ldd /ndipiazza/build/work/perl-5.6.2/bld/perl.exe
        ntdll.dll => /cygdrive/c/Windows/SysWOW64/ntdll.dll (0x77910000)
        kernel32.dll => /cygdrive/c/Windows/syswow64/kernel32.dll (0x75cb0000)
        KERNELBASE.dll => /cygdrive/c/Windows/syswow64/KERNELBASE.dll (0x757e0000)
        libperl5_6_2.dll => /ndipiazza/build/work/perl-5.6.2/bld/libperl5_6_2.dll (0x66140000)
        cygcrypt-0.dll => /usr/bin/cygcrypt-0.dll (0x67db0000)
        cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000)
        ??? => ??? (0x570000)

谁能明白为什么我会得到这个 sigabrt?

编辑:这是 Cygwin 邮件列表中正在进行的讨论的链接:http: //cygwin.com/ml/cygwin/2012-07/msg00368.html

4

3 回答 3

5

5.6 对于您的构建环境来说已经过时了。存在维护补丁

我建议安装perlbrew和patchperl

$ perlbrew install-patchperl

这将是 DTRT。

于 2012-06-22T15:39:52.307 回答
4

这个问题超出了我的工资等级,这是在黑暗中的一个镜头,但我记得破坏基于 Cygwin 的 perl5.6.2 构建的两件事是

  1. $PATH(例如/cygdrive/c/Program Files/BlahBlahBlah)中的空格
  2. 配置脚本无法确定信号名称

检查你的config.sh脚本,看看它是否包含像

sig_count='1'
sig_name='ZERO '
sig_name_init='"ZERO", 0'
sig_num='0 '
sig_num_init='0, 0'

你想让它说类似的东西

sig_count='33'
sig_name='ZERO HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH LOST USR1 USR2 RTMAX CLD POLL PWR RTMIN '
sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "EMT", "FPE", "KILL", "BUS", "SEGV", "SYS", "PIPE", "ALRM", "TERM", "URG", "STOP", "TSTP", "CONT", "CHLD", "TTIN", "TTOU", "IO", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "LOST", "USR1", "USR2", "RTMAX", "CLD", "POLL", "PWR", "RTMIN", 0'
sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 20 23 29 32 '
sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 20, 23, 29, 32, 0'

(我从更新版本的 Perl 的构建中复制了这些值config.sh。您需要的值可能略有不同)

于 2012-06-22T15:44:07.033 回答
1

我想到了。Perl 5.6.2 尝试使用它自己的 malloc。这与 Cygwin 的 malloc 不兼容。

我在 Cygwin 邮件列表上得到了一些帮助来解决这个问题:http ://cygwin.com/ml/cygwin/2012-07/msg00380.html

底线,添加-Dusemymalloc=n到 sh ./Configure 参数。

然后它工作。

于 2012-07-19T16:59:56.287 回答