Manpages

______________________________________________________________________________

NAME

load - 裝 載 機 器 代 碼 並 初 始 化 新 命 令 。

總 覽 SYNOPSIS

load fileName
load
fileName packageName
load
fileName packageName interp _________________________________________________________________

描 述 DESCRIPTION

這 個 命 令 把 二 進 制 代 碼 從 一 個 文 件 裝 載 到 應 用 的 地 址 空 間 中 並 調 用 在 包 (package)中 的 初 始 化 過 程 來 把 它 加 入 到 解 釋 器 中 。 fileName 是 包 含 代 碼 的 文 件 的 名 字 ; 它 準 確 的 形 式 在 不 同 的 系 統 上 是 不 同 的 , 但 在 多 數 系 統 上 是 一 個 共 享 庫 , 例 如 , 在 Solaris 下 的 .so 文 件 或 在 Windows 下 的 一 個 DLL。 packageName 是 包 的 名 字 , 並 被 用 於 計 算 初 始 化 過 程 的 名 字 。 interp 是 要 在 其 中 裝 載 包 的 解 釋 器 的 路 徑 名 (詳 情 參 見 interp 手 冊 條 目 ); 如 果 省 略 了 interp , 它 的 缺 省 是 在 其 中 調 用 load 命 令 的 那 個 解 釋 器 。 一 旦 已 經 被 裝 載 到 應 用 的 地 址 空 間 中 , 兩 個 初 始 化 過 程 之 一 將 在 新 代 碼 中 被 調 用 。 典 型 的 , 初 始 化 進 程 將 向 一 個 Tcl 解 釋 器 添 加 新 命 令 。 初 始 化 過 程 的 名 字 由 packageName 和 目 標 解 釋 器 是 否 是 安 全 解 釋 器 來 確 定 。 對 於 通 常 的 解 釋 器 , 初 始 化 過 程 的 名 字 的 形 式 是 pkg_Init, 這 裏 pkgpackageName 相 同 , 但 是 第 一 個 字 母 被 轉 換 成 大 寫 而 所 有 其 他 字 母 被 轉 換 成 小 寫 。 例 如 , 如 果 packageNamefooFOo, 則 初 始 化 過 程 的 名 字 將 是 Foo_Init。 如 果 目 標 解 釋 器 是 一 個 安 全 解 釋 器 , 則 初 始 化 過 程 的 名 字 將 是 pkg_SafeInit 而 不 是 pkg_Init。 寫 pkg_SafeInit 函 數 要 仔 細 , 在 包 中 提 供 的 功 能 中 , 只 用 由 不 可 信 任 的 代 碼 使 用 是 安 全 的 的 那 部 分 初 始 化 安 全 解 釋 器 。 關 於 Safe-Tcl 的 詳 細 的 信 息 , 請 參 見 safe 手 冊 條 目 。 初 始 化 過 程 必 須 匹 配 下 列 原 型 (prototype):

typedef int Tcl_PackageInitProc(Tcl_Interp *interp);

interp 參 數 標 識 在 其 中 裝 載 包 的 解 釋 器 。 初 始 化 過 程 必 須 返 回 TCL_OKTCL_ERROR 來 指 示 是 否 成 功 完 成 ; 在 有 錯 誤 的 情 況 下 , 應 把 解 釋 器 的 結 果 設 置 爲 指 向 一 個 錯 誤 消 息 。 初 始 化 過 程 返 回 的 結 果 就 是 load 命 令 的 結 果 。 在 一 個 應 用 中 對 每 個 fileName 只 進 行 一 次 文 件 的 實 際 裝 載 。 如 果 一 個 給 定 的 fileName 被 裝 載 到 多 個 解 釋 器 中 , 則 第 一 個 load 將 裝 載 代 碼 並 調 用 初 始 化 過 程 ; 隨 後 的 load 將 調 用 初 始 化 過 程 而 不 再 次 裝 載 代 碼 。 不 可 能 卸 載 或 重 載 一 個 包 。

load 命 令 還 支 持 同 應 用 靜 態 連 接 的 包 , 條 件 是 這 些 包 已 經 通 過 調 用 Tcl_StaticPackage 過 程 註 冊 過 了 。 如 果 fileName 是 一 個 空 串 , 則 必 須 指 定 packageName 。 如 果 省 略 了 packageName 或 被 指 定 爲 一 個 空 串 , Tcl 嘗 試 着 猜 出 包 的 名 字 。 在 不 同 的 平 臺 上 可 能 是 不 同 的 。 在 多 數 UNIX 平 臺 上 , 缺 省 的 猜 測 是 接 受 fileName 的 最 後 的 組 成 部 分 , 如 果 前 三 個 字 符 是 lib 就 去 掉 它 們 , 使 用 所 有 隨 後 的 字 母 和 下 劃 線 作 爲 模 塊 的 名 字 。 例 如 , 命 令 load libxyz4.2.so 使 用 模 塊 名 xyz 而 命 令 load bin/last.so {} 使 用 模 塊 名 last。 如 果 fileName 是 一 個 空 串 , 則 必 須 指 定 packageNameload 命 令 首 先 用 這 個 名 字 查 找 一 個 靜 態 裝 載 包 (通 過 調 用 Tcl_StaticPackage 過 程 註 冊 的 包 ); 如 果 找 到 了 就 使 用 它 。 否 則 , load 命 令 用 這 個 名 字 查 找 動 態 裝 載 包 , 如 果 找 到 就 使 用 它 。 如 果 一 些 不 同 的 文 件 被 裝 載 成 包 的 不 同 版 本 , Tcl 選 擇 被 最 先 裝 載 的 文 件 。

移 植 要 點 PORTABILITY ISSUES

Windows 在 裝 載 出 現 "library not found" 錯 誤 的 時 候 , 也 有 可 能 是 沒 找 到 一 個 依 賴 庫 。 要 查 看 依 賴 庫 , 在 一 個 DOS 控 制 檯 中 “dumpbin -imports <dllname>”來 查 看 必 須 導 入 那 些 庫 。 在 當 前 目 錄 中 裝 載 一 個 DLL 的 時 候 , Windows 將 忽 略 作 爲 一 個 路 徑 指 定 符 (specifier)的 “./”, 轉 而 使 用 一 次 啓 發 式 (heuristic)的 查 找 來 找 到 這 個 DLL。 要 避 免 如 此 , 裝 載 DLL 就 要 用

load [file join [pwd] mylib.DLL]

BUGS

如 果 以 不 同 的 fileNames 裝 載 同 一 個 文 件 , 它 將 被 多 次 載 入 這 個 進 程 的 地 址 空 間 。 在 不 同 的 系 統 上 裝 載 的 行 爲 是 不 同 的 (一 些 系 統 可 以 檢 測 多 餘 的 裝 載 , 其 他 的 可 能 不 能 )。

參 見 SEE ALSO

info sharedlibextension, Tcl_StaticPackage(3), safe(n)

關 鍵 字 KEYWORDS

binary code, loading, safe interpreter, shared library

[中 文 版 維 護 人 ]

寒 蟬 退 士

[中 文 版 最 新 更 新 ]

2001/08/30

《 中 國 Linux 論 壇 man 手 冊 頁 翻 譯 計 劃 》 :

http://cmpp.linuxforum.net

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。 中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh