NetWare 可加载模块编程 HOWTO

Martin Hinner, < martin@hinner.info>

版本 0.3, 2007 年 1 月 4 日
本文档介绍了如何在 Linux 下使用 GNU CC 和 GNU binutils 中的 nlmconv(1) 开发 NetWare 可加载模块。这不是 Novell 官方文档;是我在没有 Novell, Inc. 的任何帮助或合作的情况下编写的。请注意,Novell Netware 现在正变得非常过时。事实上,直到现在(2007 年),我已经超过五年没有更新这个 HOWTO 了。

1. 简介

2. 设置您的 Linux Box 和 NetWare 服务器

3. 第一步:Hello world

4. NLM 头文件

5. 消息文件

6. 帮助文件

7. XDC 数据文件

8. 头文件 (.h)

9. 导入文件 (.imp)


1. 简介

NetWare 可加载模块 (NLM) 是在 Novell NetWare 服务器上运行的程序。NLM 成为 NetWare 操作系统的一部分。您可以在服务器运行时加载和卸载 NLM。

“官方”的 NLM 编译器是

(顺便提一下,NetWare 5 也可以加载 32 位 DLL,可以使用 Microsoft Visual C++、Borland C++ 和其他 Windows 编译器构建。有关更多信息,请参见 http://developer.novell.com/ndk/dllcomp.htm)

本文档介绍了如何在 Linux(以及可能的其他 Unix 系统)下开始 NLM 开发。请注意,这个项目还处于非常早期的开发阶段,因此很多东西可能无法按您的预期工作。

本文档假设您熟悉 Novell NetWare,并且至少具备编写 NLM 的基本知识。有关编写 NLM 的更多信息,请参见 Novell 的开发者站点 http://developer.novell.com/。您还应该具有使用 Unix 和 C/C++ 编程以及 GNU CC 的经验。您可以在 http://www.linuxdoc.org/ 找到有关此主题的很多信息。

1.1 C++ 开发

据我所知,目前使用 gcc 进行 C++ 开发是不可能的,除非有人至少移植 gcc 软件包中的 libstdc++ 和 libgcc 库。

1.2 相关文档

其他可能非常有用的文档包括

1.3 版权

版权所有 (c) 2000 Martin Hinner, < martin@hinner.info>, http://martin.hinner.info

本 HOWTO 是自由文档;您可以根据自由软件基金会发布的 GNU 通用公共许可证条款对其进行再分发和/或修改;可以是许可证的第 2 版,或(由您选择)任何更高版本。

发布此文档是希望它有用,但不作任何担保;甚至不包含对适销性或特定用途适用性的暗示担保。有关更多详细信息,请参见 GNU 通用公共许可证。

您可以写信至 Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA,以获取 GNU 通用公共许可证的副本。

1.4 联系作者

您可以通过 martin@hinner.info 联系我。我欢迎任何建议和更正,但请在提问之前,先尝试在互联网上搜索。您还应该查看我的主页 (http://martin.hinner.info/),以获取任何更新或其他信息。请注意,我非常忙于我的其他项目(如 汽车诊断, 基于 ARM 的微处理器开发工具),并且我有一份全职工作(我在 SECONS Ltd.Fintera Ltd. 工作)。


2. 设置您的 Linux Box 和 NetWare 服务器

您需要安装和配置以下内容以进行 NLM 开发

您可能还想从我的 FTP 站点下载 nlm-examples 软件包:ftp://ftp.penguin.cz/pub/users/mhi/nlm/ftp://ftp.funet.fi/pub/mirrors/ftp.penguin.cz/pub/users/mhi/nlm/

2.1 Novell NetWare 服务器

让我们从 NetWare 服务器开始。您可以使用 NetWare 版本 3.X、4.X 或 5.X。可以从 Novell Inc. 订购 NetWare 5(或 5.1)三个用户“演示”版本,只需几美元。不要被“演示”这个词迷惑,它是功能齐全的 NetWare,只是它限制为三个用户。顺便说一下,此许可证可以在线升级到五个用户,无需任何费用。您也可以尝试向您当地的 Novell 合作伙伴索取演示 CD(它们可能是免费的)。

2.2 带有 IPX/NCPFS 的 Linux Box

您需要重新编译内核,启用“IPX 协议”和“NCP 文件系统支持”选项。如果您正在使用 NDS,请不要忘记对“NDS 身份验证支持”选择“是”。然后,您必须配置 IPX 协议并挂载您的 NetWare 服务器卷。确保您已安装 ncpfs 软件包!我使用这个脚本


#!/bin/sh

ipx_interface delall   
ipx_interface add -p eth0 802.2 120 # Frame Ethernet_802.2, ipx net num 120
insmod ncpfs                        # I have NCPfs compiled as module
ncpmount -U admin -S elf -P XYZ /nw # mount all ELF's volumes as /nw

有关配置 IPX 和 NCPFS 的更多信息,请参见 IPX-HOWTO。

2.3 GNU C 编译器

我认为所有现代 Intel x86 Linux 都包含 gcc,它可以生成 ELF32/i386 目标文件。如果您使用的是较旧的 Linux 发行版,它可能使用 a.out 格式而不是 ELF。如果您的 Linux 没有使用 ELF,请获取并安装较新的 gcc。

2.4 nlmconv(1) from GNU binutils

nlmconv(1) 实用程序将目标文件链接到 NLM 格式。它是 GNU binutils 的标准部分,但不幸的是,它不包含在当前的发行版(RedHat、SuSE、Debian...)中。从 ftp.gnu.org 获取 binutils 源代码并编译它们,或者直接使用我的 nlm-kit 软件包中预编译的 nlmconv。

2.5 nlm-kit 软件包

我的 nlm-kit 软件包可从 ftp://ftp.penguin.cz/pub/users/mhi/nlm/ 获取。它包含 NLM 开发所需的文件。解压它并运行 "make all""make install"。它将创建目录 /usr/nwsdk/ 并安装所有导入文件、目标文件和 nlmimp(1) 实用程序。

2.6 来自 NDK 的包含文件和文档

获取 NDK 很简单

您需要 NDK 中的这些文件(所有文件都可以在 http://developer.novell.com/ndk/clib.htm 在线获取

遗憾的是,上面提到的所有文件都是 InstallShield Win32 可执行文件。您必须找到一台 Windows 机器来解压它们,然后将包含文件复制到 /usr/nwsdk/include/,并将文档/示例复制到您想要的任何位置。Novell 许可证不允许我使用 nlm-kit 分发包含文件或文档。

由于 NDK 包含文件在 Linux 下无法工作,因此您需要在 nlm-kit-X.Y/ 目录中键入 "make install-include" 来手动修补它们。

2.7 访问 NetWare 服务器 (Xconsole 或 rconsole)

您可以直接访问 NetWare 服务器控制台(键盘和显示器),使用 rconsole.exe(来自 dosemu),或使用 telnetd.nlm/Xconsole(您需要 X 服务器才能使用)。


3. 第一步:Hello world

像往常一样,我们将从著名的 “Hello world” 程序开始。hello.nlm 的源代码在 nlm-samples 软件包中提供。您可以从 ftp://ftp.penguin.cz/pub/users/mhi/nlm/ 下载它。

3.1 hello.c - 源文件


#define N_PLAT_NLM                                /* Define dest. platform */

#include <nwconio.h>                              /* ConsolePrintf */

int
main (int argc, char **argv)
{
  int i;

  ConsolePrintf ("\rHello world!\n\n");           /* print on system console */

  ConsolePrintf("Arguments:\n");                  /* all arguments */
  for (i=0;i<argc;i++)
   ConsolePrintf("argv[%u]=\"%s\"\n",i, argv[i]);

  return 0;                                       /* exit NLM */
}

3.2 hello.def - NLM 头文件


#
# hello.def - NLM Header definition file for nlmconv(1)
# Copyright (c) 2000 Martin Hinner <martin@hinner.info>
#

# define startup object files
INPUT   hello.o
INPUT   /usr/nwsdk/lib/prelude.o            # clib startup code

# all imported functions and import lists
IMPORT @/usr/nwsdk/imports/clib.imp         # Functions in CLIB.NLM
IMPORT @/usr/nwsdk/imports/threads.imp      # Functions in THREADS.NLM

# NLM header...
OUTPUT  hello.nlm                           # output file
TYPE 0                                      # Ordinary NLM
VERSION 1,0,0                               # Version 1.0
COPYRIGHT "Copyright (c) 2000 Martin Hinner <martin@hinner.info>" # (c) ...
DESCRIPTION "Simple 'Hello world' NLM module." # title of nlm
SCREENNAME "System Console"                 # Default screen name

MODULE CLIB,THREADS                         # req'd modules

3.3 Makefile


# makefile for "hello world" NLM

CC = gcc
CFLAGS = -Wall -O2 -g -I/usr/nwsdk/include/ -nostdinc -fno-builtin -fpack-struct

hello.nlm:      hello.o hello.def
        nlmconv --output-target=nlm32-i386 -T hello.def

hello.o:        hello.c
        $(CC) $(CFLAGS) -c hello.c

3.4 GCC 问题

您必须将这些参数传递给 gcc

3.5 测试模块

将 hello.nlm 复制到您的 NetWare 服务器上的 SYS:\SYSTEM 目录。然后,在系统控制台上,键入 “load hello.nlm”。如果一切顺利,您应该看到 NLM 版本信息、版权消息和 “Hello world”。


4. NLM 头文件

NLM 头文件包含 nlmconv(1) 的信息。每行包含一个选项或指令;“#” 之后的所有内容都是注释。本章介绍了所有选项和指令。

本章尚未完成,抱歉。

4.1 AUTOUNLOAD

语法:

AUTOUNLOAD

4.2 CHECK

语法:

CHECK <检查过程名称>

此指令指定当使用 UNLOAD 服务器控制台命令卸载 NLM 时要执行的函数。如果此函数返回零,则可以卸载 NLM,否则 NLM 尚未准备好卸载。

示例:


CHECK CheckUnload

4.3 CODESTART

语法:

CODESTART <映射文件代码起始偏移量>

映射文件起始偏移量可以是十进制或 Xhex。

4.4 COPYRIGHT

语法:

COPYRIGHT ["版权字符串"]

版权字符串在加载 NLM 时显示在服务器控制台屏幕上。如果未使用此选项,则不显示版权信息。

示例:


COPYRIGHT "Copyright (c) 1998 ABC Inc."

4.5 CUSTOM

语法:

CUSTOM <自定义数据文件路径>

4.6 DATASTART

语法:

DATASTART <映射文件数据起始偏移量>

映射文件数据起始偏移量可以是十进制或 Xhex。

4.7 DATE

语法:

DATE <月, 日, 年>

4.8 DEBUG

语法:

DEBUG

此指令告诉 nlmconv(1) 在 NLM 文件中包含调试信息。

示例:


DEBUG

4.9 DESCRIPTION

语法:

DESCRIPTION "NLM 描述字符串"

4.10 EXIT

语法:

EXIT <退出过程名称>

4.11 EXPORT

语法:

EXPORT <符号列表>

EXPORT @<符号列表文件>

4.12 FLAG_OFF

语法:

FLAG_OFF <十进制数字>

4.13 FLAG_ON

语法:

FLAG_ON <十进制数字>

4.14 HELP

语法:

HELP <帮助文件路径>

4.15 IMPORT

语法:

IMPORT <符号列表>

IMPORT @<符号列表文件>

4.16 INPUT

语法:

INPUT <目标文件> [, <目标文件> [, ...] ]

INPUT @<目标列表文件>

此指令列出要链接的输入 ELF (.o) 目标文件。您也可以在列表文件中列出目标文件,每个目标文件占一行。

示例:


INPUT @objectfiles.txt
INPUT main.o
INPUT /usr/nwsdk/lib/prelude.o

4.17 MAP

语法:

MAP [映射文件名]

4.18 MESSAGES

语法:

MESSAGES <消息文件路径>

4.19 MODULE

语法:

MODULE <自动加载 NLM 列表>

4.20 MULTIPLE

语法:

MULTIPLE

4.21 NAMELEN

语法:

NAMELEN <十进制数字>

默认值为 31。零表示无限制。

4.22 OS_DOMAIN

语法:

OS_DOMAIN

4.23 OUTPUT

语法:

OUTPUT <目标文件名>

4.24 PATH

语法:

PATH [搜索路径;...]

用于以下 CUSTOM、HELP、INPUT、MESSAGES、SHARELIB、STAMPEDDATA 和 XDCDATA。

4.25 PSEUDOPREEMPTION

语法:

PSEUDOPREEMPTION

4.26 REENTRANT

语法:

REENTRANT

4.27 SCREENNAME

语法:

SCREENNAME "初始屏幕名称 (CLIB)"

4.28 SHARELIB

语法:

SHARELIB <共享库路径>

4.29 STACK

语法:

STACK <堆栈大小>

4.30 STACKSIZE

语法:

STACKSIZE <堆栈大小>

4.31 STAMPEDDATA

语法:

STAMPEDDATA "戳记" <数据文件路径>

戳记最多 8 个字符。

4.32 START

语法:

START <启动过程名称>

默认值为 _Prelude。

4.33 SYNCHRONIZE

语法:

SYNCHRONIZE

4.34 THREADNAME

语法:

THREADNAME "初始进程名称 (CLIB)"

4.35 TYPE

语法:

TYPE <版本>

此指令指定要生成的 NLM 文件的格式(NLM、LAN、DSK、NAM)。有效值是

示例:


TYPE 0

4.36 VERSION

语法:

VERSION <主版本号>, <次版本号> [, <修订号>]

版本信息在 NLM 加载时显示在服务器系统控制台上。主版本号和次版本号可以是 0 - 99。修订号可以是 0 - 26 (“a” - “z”),并且是可选的。版本指令是必需的。

示例:


VERSION 1,5

4.37 XDCDATA

语法:

XDCDATA <XDC 数据文件路径>


5. 消息文件

消息文件包含(正如您所猜测的)由 NLM 生成的文本消息。您可以使用 DOS 程序 MSGLIB.EXE 和 MSGMAKE.EXE 创建它。我不知道任何类似的 Unix 实用程序。抱歉,您将不得不使用 dosemu 或 DOS 机器 :-(


6. 帮助文件

帮助文件包含用于 NWSNUT 用户界面库的帮助。没有已知的 Linux 实用程序用于创建帮助文件。您必须使用 DOS 程序 HELPLIB.EXE,该程序可从 Novell 开发者站点获得。


7. XDC 数据文件

XDC 文件由 NetWare 5(或 SMP NetWare 4.x)使用,并存储有关对称多处理 (SMP) 的信息。您可能不需要它们。至少现在不需要 :-) 同样,没有 Unix 实用程序用于创建 XDC 文件,您将不得不使用 MPKXDC.EXE 程序(也可在 Novell 开发者站点上获得)。


8. 头文件 (.h)

(待办)


9. 导入文件 (.imp)

(待办)

9.1 使用 nlmimp(1) 生成导入文件

程序 nlmimp(1) 是我的 nlm-kit 软件包的一部分。 (待办)