load.n
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
- '"
- '" Copyright (c) 1995-1996 Sun Microsystems, Inc.
- '"
- '" See the file "license.terms" for information on usage and redistribution
- '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- '"
- '" RCS: @(#) $Id: load.n,v 1.7.2.2 2007/09/20 16:24:46 dgp Exp $
- '"
- .so man.macros
- .TH load n 7.5 Tcl "Tcl Built-In Commands"
- .BS
- '" Note: do not modify the .SH NAME line immediately below!
- .SH NAME
- load - Load machine code and initialize new commands.
- .SH SYNOPSIS
- fBload fIfileNamefR
- .br
- fBload fIfileName packageNamefR
- .br
- fBload fIfileName packageName interpfR
- .BE
- .SH DESCRIPTION
- .PP
- This command loads binary code from a file into the
- application's address space and calls an initialization procedure
- in the package to incorporate it into an interpreter. fIfileNamefR
- is the name of the file containing the code; its exact form varies
- from system to system but on most systems it is a shared library,
- such as a fB.sofR file under Solaris or a DLL under Windows.
- fIpackageNamefR is the name of the package, and is used to
- compute the name of an initialization procedure.
- fIinterpfR is the path name of the interpreter into which to load
- the package (see the fBinterpfR manual entry for details);
- if fIinterpfR is omitted, it defaults to the
- interpreter in which the fBloadfR command was invoked.
- .PP
- Once the file has been loaded into the application's address space,
- one of two initialization procedures will be invoked in the new code.
- Typically the initialization procedure will add new commands to a
- Tcl interpreter.
- The name of the initialization procedure is determined by
- fIpackageNamefR and whether or not the target interpreter
- is a safe one. For normal interpreters the name of the initialization
- procedure will have the form fIpkgfB_InitfR, where fIpkgfR
- is the same as fIpackageNamefR except that the first letter is
- converted to upper case and all other letters
- are converted to lower case. For example, if fIpackageNamefR is
- fBfoofR or fBFOofR, the initialization procedure's name will
- be fBFoo_InitfR.
- .PP
- If the target interpreter is a safe interpreter, then the name
- of the initialization procedure will be fIpkgfB_SafeInitfR
- instead of fIpkgfB_InitfR.
- The fIpkgfB_SafeInitfR function should be written carefully, so that it
- initializes the safe interpreter only with partial functionality provided
- by the package that is safe for use by untrusted code. For more information
- on Safe-Tcl, see the fBsafefR manual entry.
- .PP
- The initialization procedure must match the following prototype:
- .CS
- typedef int Tcl_PackageInitProc(Tcl_Interp *fIinterpfR);
- .CE
- The fIinterpfR argument identifies the interpreter in which the
- package is to be loaded. The initialization procedure must return
- fBTCL_OKfR or fBTCL_ERRORfR to indicate whether or not it completed
- successfully; in the event of an error it should set the interpreter's result
- to point to an error message. The result of the fBloadfR command
- will be the result returned by the initialization procedure.
- .PP
- The actual loading of a file will only be done once for each fIfileNamefR
- in an application. If a given fIfileNamefR is loaded into multiple
- interpreters, then the first fBloadfR will load the code and
- call the initialization procedure; subsequent fBloadfRs will
- call the initialization procedure without loading the code again.
- It is not possible to unload or reload a package.
- .PP
- The fBloadfR command also supports packages that are statically
- linked with the application, if those packages have been registered
- by calling the fBTcl_StaticPackagefR procedure.
- If fIfileNamefR is an empty string, then fIpackageNamefR must
- be specified.
- .PP
- If fIpackageNamefR is omitted or specified as an empty string,
- Tcl tries to guess the name of the package.
- This may be done differently on different platforms.
- The default guess, which is used on most UNIX platforms, is to
- take the last element of fIfileNamefR, strip off the first
- three characters if they are fBlibfR, and use any following
- .VS
- alphabetic and underline characters as the module name.
- .VE
- For example, the command fBload libxyz4.2.sofR uses the module
- name fBxyzfR and the command fBload bin/last.so {}fR uses the
- module name fBlastfR.
- .VS "" br
- .PP
- If fIfileNamefR is an empty string, then fIpackageNamefR must
- be specified.
- The fBloadfR command first searches for a statically loaded package
- (one that has been registered by calling the fBTcl_StaticPackagefR
- procedure) by that name; if one is found, it is used.
- Otherwise, the fBloadfR command searches for a dynamically loaded
- package by that name, and uses it if it is found. If several
- different files have been fBloadfRed with different versions of
- the package, Tcl picks the file that was loaded first.
- .VE
- .SH "PORTABILITY ISSUES"
- .TP
- fBWindowsfR
- .
- When a load fails with "library not found" error, it is also possible
- that a dependent library was not found. To see the dependent libraries,
- type ``dumpbin -imports <dllname>'' in a DOS console to see what the
- library must import.
- When loading a DLL in the current directory, Windows will ignore ``./'' as
- a path specifier and use a search heuristic to find the DLL instead.
- To avoid this, load the DLL with:
- .CS
- fBloadfR [file join [pwd] mylib.DLL]
- .CE
- .SH BUGS
- .PP
- If the same file is fBloadfRed by different fIfileNamefRs, it will
- be loaded into the process's address space multiple times. The
- behavior of this varies from system to system (some systems may
- detect the redundant loads, others may not).
- .SH EXAMPLE
- The following is a minimal extension:
- .PP
- .CS
- #include <tcl.h>
- #include <stdio.h>
- static int fooCmd(ClientData clientData,
- Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) {
- printf("called with %d arguments\n", objc);
- return TCL_OK;
- }
- int Foo_Init(Tcl_Interp *interp) {
- if (Tcl_InitStubs(interp, "8.1", 0) == NULL) {
- return TCL_ERROR;
- }
- printf("creating foo command");
- Tcl_CreateObjCommand(interp, "foo", fooCmd, NULL, NULL);
- return TCL_OK;
- }
- .CE
- .PP
- When built into a shared/dynamic library with a suitable name
- (e.g. fBfoo.dllfR on Windows, fBlibfoo.sofR on Solaris and Linux)
- it can then be loaded into Tcl with the following:
- .PP
- .CS
- # Load the extension
- switch $tcl_platform(platform) {
- windows {
- fBloadfR [file join [pwd] foo.dll]
- }
- unix {
- fBloadfR [file join [pwd] libfoo[info sharedlibextension]]
- }
- }
- # Now execute the command defined by the extension
- foo
- .CE
- .SH "SEE ALSO"
- info sharedlibextension, Tcl_StaticPackage(3), safe(n)
- .SH KEYWORDS
- binary code, loading, safe interpreter, shared library