开源 视频检索

    技术2024-06-25  98

    本文介绍如何将流行的开源项目移植到IBM z / OS UNIX环境。 以下三个原因促使我们写这篇文章:

    我们的项目涉及现代软件的几乎所有基本方面,即数据,网络,命令终端I / O和标准库。 它们本身不仅是有趣的领域,而且还为软件设计人员提供了有关平台和移植过程的重要知识。 自由软件系统具有它们自己的一套约定,区别和限制,这些规则,区别和限制一开始可能对结构化编程背景的开发人员来说是特殊的或令人困惑的。 更深入的检查表明,自由软件在技术创新方面非常丰富,并且自由软件运动是促进发展和增长的有效协作环境。 本文阐述了这些观点,并加强了IBM系统与自由软件运动之间的联系。 增强现有知识体系。 有很多书籍以通用术语描述了移植(包括移植到zSeries®)。 但是,描述了特定挑战和解决方案的真实帐户对于开发人员而言更为有效。 希望软件开发人员能够在他们的项目中应用这些技术,并提高他们对移植到IBM平台的理解。

    本文适用于中级到高级UNIX开发人员。 建议熟悉IBM平台,尤其是zSeries UNIX。 本文重点讨论关键概念和技术问题,但建议您紧接IBM UNIX参考。 下面的参考资料是必不可少的(见相关信息的链接):

    z / OS和OS / 390 UNIX上的C / C ++应用程序(SG24-5992-01) 适用于z / OS和OS / 390 UNIX的开源软件(SG2459-44) z / OS V1R11.0 UNIX系统服务命令参考(SA22-7802-11) z / OS V1R11.0 XL C / C ++运行时库参考(SA22-7821-11) z / OS UNIX系统服务移植指南

    设置端口

    本文首先概述了项目和移植环境。 该项目称为Wget,这是一个免费软件包,可以使用各种Internet协议检索文件。 看看wget的主页(请参阅相关信息 ),以了解其功能,选项和使用情况。

    假定您有权访问z / OS UNIX环境。 您可以通过兼容的telnet应用程序使用典型的登录Shell。 但是,批处理用户可以完全像交互式用户一样执行操作并获得相同的结果。 清单1描述了如何设置移植环境。

    清单1.设置端口环境
    /tmp/x $ uname -I -a z/OS MYZOS 11.00 01 2097 /tmp/x $ ls wget-1.9.tar.gz wget-1.9.tar.gz /tmp/x $ gunzip -c wget-1.9.tar.gz | pax -ofrom=ISO8859-1,to=IBM-1047 -rv wget-1.9 wget-1.9/doc wget-1.9/doc/ChangeLog-branches wget-1.9/doc/ChangeLog-branches/1.6_branch.ChangeLog wget-1.9/doc/ChangeLog ... wget-1.9/ltmain.sh wget-1.9/mkinstalldirs wget-1.9/stamp-h.in /tmp/x $ cd wget-1.9 /tmp/x/wget-1.9 $

    uname命令指示正在使用操作系统的版本1发行版11。 这对于确定库,工具和文档的选项和功能以及报告错误很有用。 清单的其余部分显示了如何解压缩Wget源程序包。 请注意使用pax命令将ASCII源转换为EBCDIC。 现在,您准备开始端口了。

    配置Wget

    自由软件包通常使用三个或四个步骤来构建。 大多数免费软件包都包含一个名为README或INSTALL的文件,该文件描述了构建。 第一步是配置; 这是通过运行软件包随附的configure脚本来完成的。

    清单2.配置
    /tmp/x/wget-1.9 $ ./configure >config.out 2>config.err /tmp/x/wget-1.9 $ cat config.out 1 configuring for GNU Wget 1.9 2 checking build system type... i370-ibm-openedition 3 checking host system type... i370-ibm-openedition 4 checking whether make sets $(MAKE)... yes 5 checking for a BSD-compatible install... ./install-sh -c 6 checking for gcc... no 7 checking for cc... cc 8 checking for C compiler default output... a.out 9 checking whether the C compiler works... yes 10 checking whether we are cross compiling... no 11 checking for suffix of executables... 12 checking for suffix of object files... o 13 checking whether we are using the GNU C compiler... no 14 checking whether cc accepts -g... yes 15 checking for cc option to accept ANSI C... none needed 16 checking how to run the C preprocessor... cc -E ... 55 checking for cc option to accept ANSI C... no 56 checking for function prototypes... no ... 84 checking sys/utime.h usability... yes 85 checking sys/utime.h presence... no 86 configure: WARNING: sys/utime.h: accepted by compiler, rejected by preprocessor! 87 configure: WARNING: sys/utime.h: proceeding with the preprocessor's result 88 configure: WARNING: ## ------------------------------------ ## 89 configure: WARNING: ## Report this to bug-autoconf@gnu.org. ## 90 configure: WARNING: ## ------------------------------------ ## 91 checking for sys/utime.h... no ... 117 checking for working alloca.h... no 118 checking for alloca... no ... 195 checking libintl.h usability... yes 196 checking libintl.h presence... no 197 configure: WARNING: libintl.h: accepted by compiler, rejected by preprocessor! 198 configure: WARNING: libintl.h: proceeding with the preprocessor's result 199 configure: WARNING: ## ------------------------------------ ## 200 configure: WARNING: ## Report this to bug-autoconf@gnu.org. ## 201 configure: WARNING: ## ------------------------------------ ## 202 checking for libintl.h... no ... /tmp/x/wget-1.9 $

    配置产生混合结果。 Wget认识到该平台(第3行),并可能对此做了一些假设和调整。 但是有一些皱纹。 关于ANSI C(第15行,第55行)存在一些冲突,并且某些标头和函数(例如alloca )无法识别。

    发生了什么? 查看config.log文件中的一些提示。

    清单3.配置错误
    /tmp/x/wget-1.9 $ more config.log ... 341 configure:7526: checking for cc option to accept ANSI C 342 configure:7569: cc -c -O conftest.c >&5 343 ERROR CCN3166 configure:7568 Definition of function choke requires parentheses. 344 ERROR CCN3276 configure:7568 Syntax error: possible missing '{'? 345 CCN0793(I) Compilation failed for file ./conftest.c. Object file not created. 346 FSUM3065 The COMPILE step ended with return code 12. 347 FSUM3017 Could not compile conftest.c. Correct the errors and try again. 348 configure:7572: $? = 3 349 configure: failed program was: 350 | #line 7544 "configure" 351 | /* confdefs.h. */ 352 | ... 373 | /* end confdefs.h. */ 374 | #if !defined(__STDC__) 375 | choke me 376 | #endif ... 886 WARNING CCN3296 configure:9994 #include file <sys/utime.h> not found. 887 FSUM3065 The COMPILE step ended with return code 4. 888 configure:9970: $? = 0 ... 1037 configure:10584: checking for working alloca.h 1038 configure:10606: cc -o conftest -O conftest.c >&5 1039 WARNING CCN3296 configure:10638 #include file <alloca.h> not found. 1040 FSUM3065 The COMPILE step ended with return code 4. 1041 IEW2456E 9207 SYMBOL alloca UNRESOLVED. MEMBER COULD NOT BE INCLUDED FROM THE 1042 DESIGNATED CALL LIBRARY. 1043 FSUM3065 The LINKEDIT step ended with return code 8. 1044 configure:10609: $? = 3 1045 configure: failed program was: 1046 | #line 10592 "configure" 1047 | /* confdefs.h. */ 1048 | 1049 | #define PACKAGE_NAME "" ... 1090 | #define RETSIGTYPE void 1091 | #define HAVE_STRUCT_UTIMBUF 1 1092 | /* end confdefs.h. */ 1093 | #include <alloca.h> ... 2474 configure:13513: cc -c -O conftest.c >&5 2475 WARNING CCN3296 configure:13615 #include file <libintl.h> not found. 2476 FSUM3065 The COMPILE step ended with return code 4. 2477 configure:13516: $? = 0 ... /tmp/x/wget-1.9 $

    这些提示是结论性的。 343-344行指向375行; 这行使编译器窒息。 出现alloca问题是因为未定义符号。 尽管找不到头文件,但configure发出纯信息性警告并继续。 (这在脚本促使用户报告错误的程度上造成了混乱。)这些问题的解决方法如下。 编译器标志langlvl(extc99)和haltonmsg被调用。 langlvl标志使扩展模式能够识别未解析的符号,如果找不到头,则haltonmsg标志将编译器定向到硬停止。 包含了标准标头stdlib.h ,该标头定义了z / OS上的alloca函数。 清单4中显示了对配置文件的代码更改。此时,配置运行没有错误。

    清单4.配置更正
    /tmp/x/wget-1.9 $ vi configure ... 10660 # else 10661 # ifdef __MVS__ 10662 # include <stdlib.h> 10663 # else /* non MVS */ 10664 # ifndef alloca /* predefined by HP cc +Olibcalls */ 10665 char *alloca (); 10666 # endif 10667 # endif /* MVS */ 10668 # endif 10669 # endif 10670 # endif 10671 #endif ... /tmp/x/wget-1.9 $ ./configure CFLAGS="-Wc,langlvl(extc99),haltonmsg(CCN3296)" \ >config2.out.txt 2>&1

    注意__MVS__符号的使用。 软件的设计和编码应便于携带。 这意味着移植到新平台不应影响源代码或构建过程。 __MVS__符号隐式标识z / OS平台,不需要编译器或预处理器明确提及。 此符号标记该端口中的所有更改。

    建筑wget

    自由软件通常是由make命令构建的,我们从此命令开始。

    清单5.开始构建
    /tmp/x/wget-1.9 $ gmake echo timestamp > stamp-h.in cd src && \ gmake CC='cc' CPPFLAGS='' \ DEFS='-DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\" \ -DLOCALEDIR=\"/usr/local/share/locale\"' \ CFLAGS='-Wc,langlvl\(extc99\),haltonmsg\(CCN3296\)' LDFLAGS='' LIBS='' \ prefix='/usr/local' exec_prefix='/usr/local' bindir='/usr/local/bin' \ infodir='/usr/local/info' mandir='/usr/local/man' manext='1' gmake[1]: Entering directory `/tmp/x/wget-1.9/src' cc -I. -I. -I/opt/include -DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\" \ -DLOCALEDIR=\"/usr/local/share/locale\" -Wc,langlvl\(extc99\),haltonmsg\(CCN3296\) \ -c cmpt.c ... cc -I. -I. -I/opt/include -DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\" \ -DLOCALEDIR=\"/usr/local/share/locale\" -Wc,langlvl\(extc99\),haltonmsg\(CCN3296\) \ -c main.c ERROR CCN3052 ./main.c:461 Duplicate case label for value 132. Labels must be unique. ERROR CCN3052 ./main.c:478 Duplicate case label for value 136. Labels must be unique. ERROR CCN3052 ./main.c:488 Duplicate case label for value 146. Labels must be unique. ERROR CCN3052 ./main.c:494 Duplicate case label for value 148. Labels must be unique. ERROR CCN3052 ./main.c:527 Duplicate case label for value 165. Labels must be unique. ... /tmp/x/wget-1.9 $ vi src/main.c ... 407 case 132: 408 setoptval ("spider", "on"); 409 break; 410 case 133: 411 setoptval ("noparent", "on"); 412 break; 413 case 136: 414 setoptval ("deleteafter", "on"); 415 break; ... 461 case 'd': 462 #ifdef ENABLE_DEBUG 463 setoptval ("debug", "on"); 464 #else 465 fprintf (stderr, _("%s: debug support not compiled in.\n"), 466 exec_name); 467 #endif 468 break; 469 case 'E': 470 setoptval ("htmlextension", "on"); 471 break; 472 case 'F': 473 setoptval ("forcehtml", "on"); 474 break; 475 case 'H': ... /tmp/x/wget-1.9 $

    大多数文件编译时都不会发生意外。 但是编译器在main.c报告“重复大小写标签”错误。 发生这些错误的原因是字符文字与编号标签发生冲突。这是ASCII / EBCDIC代码页的问题。 事实证明, wget最初是为ASCII平台设计的,在该平台上,数字标签与字母字符不冲突。 在诸如z / OS之类的EBCDIC平台上,存在冲突。

    您如何解决这个问题? 解决方案是确保数字标签(第407、410、413行等)不与任何代码页中的任何字符冲突。 但是,这将需要对源代码进行几次(尽管微不足道的)更改。 回想一下,移植软件的目的之一是最大程度地减少源代码更改的数量和范围。 因此,需要不同的技术。 完全用ASCII编译源代码。 这是通过定义__LIBASCII__符号并启用CONV(ISO8859-1)选项来完成的。 (在C / C ++运行时库参考了有关如何实现这一点。看详情相关信息的链接。)这个选项,所有的文字字符串转换为ASCII,可能解决问题。

    清单6.用LIBASCII构建wget
    /tmp/x/wget-1.9 $ gmake cd src && \ gmake CC='cc' CPPFLAGS='' \ DEFS='-DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\" \ -DLOCALEDIR=\"/usr/local/share/locale\"' \ CFLAGS='-Wc,langlvl\(extc99\),haltonmsg\(CCN3296\)' LDFLAGS='' LIBS='' \ prefix='/usr/local' exec_prefix='/usr/local' bindir='/usr/local/bin' \ infodir='/usr/local/info' mandir='/usr/local/man' manext='1' gmake[1]: Entering directory `/tmp/x/wget-1.9/src' cc -I. -I. -I/opt/include -DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\"\ -DLOCALEDIR=\"/usr/local/share/locale\" -Wc,langlvl\(extc99\),haltonmsg\(CCN3296\)\ -Wc,conv\(ISO8859-1\) -D__LIBASCII__ -c cmpt.c ... cc -I. -I. -I/opt/include -DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\"\ -DLOCALEDIR=\"/usr/local/share/locale\" -Wc,langlvl\(extc99\),haltonmsg\(CCN3296\)\ -Wc,conv\(ISO8859-1\) -D__LIBASCII__ -c log.c cc -I. -I. -I/opt/include -DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\"\ -DLOCALEDIR=\"/usr/local/share/locale\" -Wc,langlvl\(extc99\),haltonmsg\(CCN3296\)\ -Wc,conv\(ISO8859-1\) -D__LIBASCII__ -c main.c cc -I. -I. -I/opt/include -DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\"\ -DLOCALEDIR=\"/usr/local/share/locale\" -Wc,langlvl\(extc99\),haltonmsg\(CCN3296\)\ -Wc,conv\(ISO8859-1\) -D__LIBASCII__ -c gen-md5.c ... /tmp/x/wget-1.9 $ ./wget ## first run %$#..$%$...$%$#$%$#$%$#$% /tmp/x/wget-1.9/src $ /tmp/x/wget-1.9 $ ./wget >out.txt ## second run /tmp/x/wget-1.9 $ iconv -f ISO8859-1 -t IBM-1047 out.txt %s: missing URL Usage: %s [OPTION]... [URL]... Try `%s --hep' for more options. /tmp/x/wget-1.9 $ src/wget http://www.ibm.com >out2.txt 2>&1 ## third run /tmp/x/wget-1.9 $ iconv -f ISO8859-1 -t IBM-1047 out2.txt --%s-- %s %s => `%s' Resolving %s... failed: %s. /tmp/x/wget-1.9 $

    生成运行无明显错误。 但是,当您第一次尝试运行它时,您会在终端上得到模糊的输出。 仔细检查发现wget确实运行正确,甚至产生了帮助消息。 第三次尝试,提供URL时,很明显wget失败,因为它无法解析参数。

    发生了什么? 眼前的诱惑是启动调试器并逐步执行代码。 但是前三个运行已经产生了足够的输出以提供一些重要的线索。 第一个线索是输出中是否存在格式规范(例如,%s)。 这表明尽管代码中的所有字符串都已转换为ASCII,但函数却错误地解释了(或根本没有解释过)它们。 例如, Xprintf函数系列中常用的%s Xprintf打印,这表明该函数根本没有解释它。 第二个线索是第三次尝试的失败。 wget (www.ibm.com)的URL参数正确,但是wget无法解析主机名。 可能的原因是主机名未转换为ASCII。 结果,名称查找失败。

    本机__LIBASCII__不能解决此问题。 在应用其他技术之前,回顾一下ASCII / EBCDIC问题的深度和确切性质将很有帮助。 它不限于转换文字字符串。 问题的另一个方面是确保Xprintf函数正确解释其参数。 这些功能也应该明智地发挥作用。 如果他们的输出到达终端,则必须正确翻译。 最后, wget与外部主机交换信息(ASCII)。 必须正确处理。 (这最后一个问题是移植指南中的说明,页103-105。请参阅相关主题的链接。)

    高级构建和调试

    libascii库中提供了ASCII / EBCDIC问题的有效解决方案。 该库包含可合理处理各种I / O方案的函数。 但是,重点并不是 libascii是解决每个ASCII / EBCDIC问题的灵丹妙药。 相反,面对ASCII / EBCDIC问题,您应该问以下问题:

    是否仅限于字符串文字? 是否有假设(例如ctype )在代码页中字母'a'...'z'是连续的? 系统是否与外部主机进行交互(交换ASCII协议数据)? 终端I / O与文件I / O的混合是什么?

    这些问题将指示最适合该问题的解决方案。

    让我们继续libascii库。 (请参阅相关主题的链接。)的说明是相当清楚的。 切记修改Makefile使其包含新的代码集指令: -D__STRING_CODE_SET__="ISO8859-1"和-D__STRING_CODE_SET__="ISO8859-1" (清单7 -D__STRING_CODE_SET__="ISO8859-1"粗体标记)。

    清单7. libascii
    /tmp/x/wget-1.9 $ vi src/main.c ... 64 #include "url.h" 65 #include "progress.h" /* for progress_handle_sigwinch */ 66 #include "convert.h" 67 68 #ifdef HAVE_SSL 69 # include "gen_sslfunc.h" 70 #endif 71 72 /* On GNU system this will include system-wide getopt.h. */ 73 #include "getopt.h" 74 75 #ifdef __MVS__ /* zOS */ 76 #include "_Ascii_a.h" 77 #endif /* zOS */ 78 79 #ifndef PATH_SEPARATOR 80 # define PATH_SEPARATOR '/' 81 #endif ... 383 i18n_initialize (); 384 385 append_to_log = 0; 386 387 #ifdef __MVS__ /* zOS */ 388 __argvtoascii_a(argc, (char **)argv); 389 #endif /* zOS */ 390 ... /tmp/x/wget-1.9 $ grep "^CFLAGS" Makefile src/Makefile Makefile:CFLAGS = -Wc,langlvl\(extc99\),haltonmsg\(CCN3296\) \ -D__STRING_CODE_SET__="ISO8859-1" Makefile:CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' LIBS='$(LIBS)' \ src/Makefile:CFLAGS = -Wc,langlvl\(extc99\),haltonmsg\(CCN3296\) \ -D__STRING_CODE_SET__="ISO8859-1"

    构建和运行同样简单。 在链接时正确地包括头文件和指定libascii.a库时,应libascii.a 。

    清单8.使用libascii库构建wget
    /tmp/x/wget-1.9 $ gmake cd src && \ gmake CC='cc' CPPFLAGS='' \ DEFS='-DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\" \ -DLOCALEDIR=\"/usr/local/share/locale\"' \ CFLAGS='-Wc,langlvl\(extc99\),haltonmsg\(CCN3296\)\ -D__STRING_CODE_SET__="ISO8859-1"'\ LDFLAGS='' LIBS='' \ prefix='/usr/local' exec_prefix='/usr/local' bindir='/usr/local/bin' \ infodir='/usr/local/info' mandir='/usr/local/man' manext='1' gmake[1]: Entering directory `/tmp/x/wget-1.9/src' cc -I. -I. -I/opt/include -DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\"\ -DLOCALEDIR=\"/usr/local/share/locale\" -Wc,langlvl\(extc99\),haltonmsg\(CCN3296\)\ -D__STRING_CODE_SET__="ISO8859-1" -c cmpt.c ... cc -I. -I. -I/opt/include -DHAVE_CONFIG_H -DSYSTEM_WGETRC=\"/usr/local/etc/wgetrc\"\ -DLOCALEDIR=\"/usr/local/share/locale\" -Wc,langlvl\(extc99\),haltonmsg\(CCN3296\)\ -D__STRING_CODE_SET__="ISO8859-1" -c version.c /bin/sh ../libtool --mode=link cc /tmp/x/libascii/libascii.a -o wget cmpt.o connect.o\ convert.o cookies.o ftp.o ftp-basic.o ftp-ls.o ftp-opie.o getopt.o hash.o headers.o\ host.o html-parse.o html-url.o http.o init.o log.o main.o gen-md5.o gnu-md5.o netrc.o\ progress.o rbuf.o recur.o res.o retr.o safe-ctype.o snprintf.o url.o utils.o version.o cc -o wget cmpt.o connect.o convert.o cookies.o ftp.o ftp-basic.o ftp-ls.o ftp-opie.o\ getopt.o hash.o headers.o host.o html-parse.o html-url.o http.o init.o log.o main.o\ gen-md5.o gnu-md5.o netrc.o progress.o rbuf.o recur.o res.o retr.o safe-ctype.o\ snprintf.o url.o utils.o version.o /tmp/x/libascii/libascii.a /tmp/x/wget-1.9 $ /tmp/x/wget-1.9 $ ./wget wget: missing URL Usage: wget [OPTION]... [URL]... Try `wget --help' for more options. /tmp/x/wget-1.9/src $ ./wget http://www.ibm.com --17:19:04-- http://www.ibm.com/ => `index.html' Resolving www.ibm.com... 129.42.56.216Killed /tmp/x/wget-1.9 $

    现在有一个新问题。 Wget成功构建,但是如清单8末尾所示,它神秘地死了。获得CEEDUMP是开始调试此问题的好方法。 CEEDUMPs(C ommonËxecutionënvironment DUMP)大致类似于UNIX核心转储。 它们通常是调试遭受异常终止的程序的起点。

    清单9.调试wget
    /tmp/x/wget-1.9 $ /tmp/x/wget-1.9 $ export _CEE_DMPTARG=/tmp/x/wget-1.9 /tmp/x/wget-1.9 $ export _CEE_RUNOPTS="termthdact(dump),trap(on,nospie)" /tmp/x/wget-1.9 $ src/wget http://www.ibm.com >out3.txt 2>&1 Segmentation fault /tmp/x/wget-1.9 $ ls CEE* CEEDUMP.20100203.183737.50462961 /tmp/x/wget-1.9 $ vi CEEDUMP.20100203.183737.50462961 1 CEE3DMP V1 R11.0: Condition processing resulted in the unhandled condition. \ 02/03/10 6:37:37 PM Page: 1 2 ASID: 028E PID: 50462961 Parent PID: 16908960 User name: ME 3 4 CEE3845I CEEDUMP Processing started. 5 6 Information for enclave main 7 8 Information for thread 242E590000000001 9 10 Traceback: 11 DSA Entry E Offset Statement Load Mod ProgramUnit Service Status 12 1 CEEHDSP +000041E2 CEEPLPKA CEEHDSP UK51026 Call 13 2 _UCS_conv +0000026A CEUUZZZZ UK50307 Exception 14 3 _iconv_exec +000001CC CEUUZZZZ HLE7760 Call 15 4 @@GETFN +000000C2 CEEEV003 Call 16 5 iconv +000000B4 CEEEV003 UK50307 Call 17 6 __toebcdic_a+000000BC wget Call 18 7 __fputs_a +000000AC wget Call 19 8 logputs +00000138 wget Call 20 9 lookup_host +00000370 wget Call 21 10 gethttp +00000232 wget Call 22 11 http_loop +00000764 wget Call 23 12 retrieve_url+00000380 wget Call 24 13 main +000018E8 wget Call 25 14 EDCZMINV +000000C2 CEEEV003 Call 26 15 CEEBBEXT +000001B8 CEEPLPKA CEEBBEXT HLE7760 Call 27 ... 64 Original Condition: 65 CEE3204S The system detected a protection exception (System Completion Code=0C4). 66 Location: 67 Program Unit: Entry: _UCS_conv 68 Statement: Offset: +0000026A ...

    CEEDUMP揭示了一切。 (语言环境调试指南[见相关主题 ]对CEEDUMPs大量的文档。)注意强制CEEDUMP所需的环境变量。 转储指示这是内存保护故障(第65行)。 它还包括回溯(第11-26行)。 回溯显示__toebcdic_a大约是程序移出wget空间的位置。 这强烈表明数据缓冲区正在越过logputs和iconv之间的内存保护边界。

    清单10.解决内存问题
    /tmp/x/wget-1.9 $ /tmp/x/wget-1.9 $ vi src/log.c ... 328 void 329 logputs (enum log_options o, const char *s) 330 { 331 FILE *fp; 332 333 check_redirect_output (); 334 if (!(fp = get_log_fp ())) 335 return; 336 CHECK_VERBOSE (o); 337 338 fputs (s, fp); 339 if (save_context_p) 340 saved_append (s); 341 if (flush_log_p) 342 logflush (); 343 else 344 needs_flushing = 1; 345 } ... /tmp/x/wget-1.9 $ /tmp/x/wget-1.9 $ vi src/log.c ## solution ... 338 #ifdef __MVS__ 339 char sbuf[256]; int len; 340 341 len = strlen(s); 342 if (len >= 256) len = 255; 343 strncpy(sbuf, s, len); sbuf[len] = '\0'; 344 fputs (sbuf, fp); 345 if (save_context_p) 346 saved_append (sbuf); 347 #else /* non MVS */ 348 fputs (s, fp); 349 if (save_context_p) 350 saved_append (s); 351 #endif /* MVS */ ... /tmp/x/wget-1.9 $ gmake ... /tmp/x/wget-1.9 $ ./wget http://www.ibm.com --19:37:58-- http://www.ibm.com/ => `index.html' Resolving www.ibm.com... 129.42.56.216 Connecting to www.ibm.com[129.42.56.216]:80... connected. HTTP request sent, awaiting response... 302 Found Location: http://www.ibm.com/us/en/ [following] --19:37:58-- http://www.ibm.com/us/en/ => `index.html' Connecting to www.ibm.com[129.42.56.216]:80... connected. HTTP request sent, awaiting response... 200 OK Length: 38,384 [text/html] 0K .......... .......... .......... ....... 100% 552.13 KB/s 19:37:59 (552.13 KB/s) - `index.html' saved [38384/38384] /tmp/x/wget-1.9/src $ #### SUCCESS!

    现在问题很明显了。 logputs的第二个参数是一个常量,但是正在被__fputs_a修改。 清单10中所示的解决方案是将其复制到缓冲区中,以便可以自由修改它。 现在,它可以按设计工作。

    总结和经验教训

    将软件(尤其是免费软件)移植到新平台是一段有趣的旅程。 该项目涵盖了配置,平台库,标准头,代码页问题,内置代码集功能,网络交互和调试。 这些问题是实际软件端口中最有可能引起麻烦的根源。 但是,本·富兰克林的智慧仍然是新鲜且相关的。 一盎司的预防值得一磅的治疗。

    您可以学到什么课程来使端口干净,快速且无故障? 移植wget的经验表明以下几点:

    注意ASCII / EBCDIC。 在应用解决方案之前定义问题的所有方面非常重要。 列出正在使用的系统调用和系统功能。 某些功能可能并不总是在所有平台上都完全相同。 最好分析常见或标准化替代方案的深奥功能。 列出正在使用的头文件。 与系统功能一样,头文件在不同平台上可能会不同地定义系统调用。 这些麻烦大多数在配置过程中很明显。 我们鼓励您研究头文件的用法并查找异常,例如非标准头。 研究操作环境。 这包括各种因素,例如网络访问,终端I / O,文件/数据库交互,平台安全性和错误处理。

    这将使我们进入第1部分的结尾。请继续关注第2部分,该部分将探讨更高级的主题,例如多线程,文件锁定和PKI安全性。

    致谢。 感谢CA Goodrich,JP Dewan,JM Hertzig,DJ Berkley和G. Chou先生的意见和建议。


    翻译自: https://www.ibm.com/developerworks/aix/library/au-porting_os/index.html

    相关资源:微信小程序源码-合集6.rar
    Processed: 0.010, SQL: 9