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
33
|
/*
* tclLoadDyld.c --
*
* This procedure provides a version of the TclLoadFile that
* works with Apple's dyld dynamic loading. This file
* provided by Wilfredo Sanchez (wsanchez@apple.com).
* This works on Mac OS X.
*
* Copyright (c) 1995 Apple Computer, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclLoadDyld.c,v 1.15 2004/04/06 22:25:56 dgp Exp $
*/
#include "tclInt.h"
#include <mach-o/dyld.h>
typedef struct Tcl_DyldModuleHandle {
struct Tcl_DyldModuleHandle *nextModuleHandle;
NSModule module;
} Tcl_DyldModuleHandle;
typedef struct Tcl_DyldLoadHandle {
const struct mach_header *dyld_lib;
Tcl_DyldModuleHandle *firstModuleHandle;
} Tcl_DyldLoadHandle;
/*
*----------------------------------------------------------------------
*
* TclpDlopen --
|
|
|
|
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
33
|
/*
* tclLoadDyld.c --
*
* This procedure provides a version of the TclLoadFile that
* works with Apple's dyld dynamic loading. This file
* provided by Wilfredo Sanchez (wsanchez@apple.com).
* This works on Mac OS X.
*
* Copyright (c) 1995 Apple Computer, Inc.
*
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
* RCS: @(#) $Id: tclLoadDyld.c,v 1.16 2005/05/14 20:46:48 das Exp $
*/
#include "tclInt.h"
#include <mach-o/dyld.h>
typedef struct Tcl_DyldModuleHandle {
struct Tcl_DyldModuleHandle *nextModuleHandle;
NSModule module;
} Tcl_DyldModuleHandle;
typedef struct Tcl_DyldLoadHandle {
CONST struct mach_header *dyld_lib;
Tcl_DyldModuleHandle *firstModuleHandle;
} Tcl_DyldLoadHandle;
/*
*----------------------------------------------------------------------
*
* TclpDlopen --
|
| ︙ | | | ︙ | |
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
* (*unloadProcPtr)() to unload the file. */
Tcl_FSUnloadFileProc **unloadProcPtr;
/* Filled with address of Tcl_FSUnloadFileProc
* function which should be used for
* this file. */
{
Tcl_DyldLoadHandle *dyldLoadHandle;
const struct mach_header *dyld_lib;
CONST char *native;
/*
* First try the full path the user gave us. This is particularly
* important if the cwd is inside a vfs, and we are trying to load
* using a relative path.
*/
|
|
|
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
* (*unloadProcPtr)() to unload the file. */
Tcl_FSUnloadFileProc **unloadProcPtr;
/* Filled with address of Tcl_FSUnloadFileProc
* function which should be used for
* this file. */
{
Tcl_DyldLoadHandle *dyldLoadHandle;
CONST struct mach_header *dyld_lib;
CONST char *native;
/*
* First try the full path the user gave us. This is particularly
* important if the cwd is inside a vfs, and we are trying to load
* using a relative path.
*/
|
| ︙ | | | ︙ | |
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
NSADDIMAGE_OPTION_WITH_SEARCHING |
NSADDIMAGE_OPTION_RETURN_ON_ERROR);
Tcl_DStringFree(&ds);
}
if (!dyld_lib) {
NSLinkEditErrors editError;
char *name, *msg;
NSLinkEditError(&editError, &errno, &name, &msg);
Tcl_AppendResult(interp, msg, (char *) NULL);
return TCL_ERROR;
}
dyldLoadHandle = (Tcl_DyldLoadHandle *) ckalloc(sizeof(Tcl_DyldLoadHandle));
if (!dyldLoadHandle) return TCL_ERROR;
|
|
|
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
NSADDIMAGE_OPTION_WITH_SEARCHING |
NSADDIMAGE_OPTION_RETURN_ON_ERROR);
Tcl_DStringFree(&ds);
}
if (!dyld_lib) {
NSLinkEditErrors editError;
CONST char *name, *msg;
NSLinkEditError(&editError, &errno, &name, &msg);
Tcl_AppendResult(interp, msg, (char *) NULL);
return TCL_ERROR;
}
dyldLoadHandle = (Tcl_DyldLoadHandle *) ckalloc(sizeof(Tcl_DyldLoadHandle));
if (!dyldLoadHandle) return TCL_ERROR;
|
| ︙ | | | ︙ | |
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
if (dyldModuleHandle) {
dyldModuleHandle->module = NSModuleForSymbol(nsSymbol);
dyldModuleHandle->nextModuleHandle = dyldLoadHandle->firstModuleHandle;
dyldLoadHandle->firstModuleHandle = dyldModuleHandle;
}
} else {
NSLinkEditErrors editError;
char *name, *msg;
NSLinkEditError(&editError, &errno, &name, &msg);
Tcl_AppendResult(interp, msg, (char *) NULL);
}
Tcl_DStringFree(&newName);
Tcl_DStringFree(&ds);
return proc;
|
|
|
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
if (dyldModuleHandle) {
dyldModuleHandle->module = NSModuleForSymbol(nsSymbol);
dyldModuleHandle->nextModuleHandle = dyldLoadHandle->firstModuleHandle;
dyldLoadHandle->firstModuleHandle = dyldModuleHandle;
}
} else {
NSLinkEditErrors editError;
CONST char *name, *msg;
NSLinkEditError(&editError, &errno, &name, &msg);
Tcl_AppendResult(interp, msg, (char *) NULL);
}
Tcl_DStringFree(&newName);
Tcl_DStringFree(&ds);
return proc;
|
| ︙ | | | ︙ | |
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
|
while (dyldModuleHandle) {
NSUnLinkModule(dyldModuleHandle->module, NSUNLINKMODULE_OPTION_NONE);
ptr = dyldModuleHandle;
dyldModuleHandle = dyldModuleHandle->nextModuleHandle;
ckfree(ptr);
}
ckfree(dyldLoadHandle);
}
/*
*----------------------------------------------------------------------
*
* TclGuessPackageName --
*
|
|
|
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
|
while (dyldModuleHandle) {
NSUnLinkModule(dyldModuleHandle->module, NSUNLINKMODULE_OPTION_NONE);
ptr = dyldModuleHandle;
dyldModuleHandle = dyldModuleHandle->nextModuleHandle;
ckfree(ptr);
}
ckfree((char*) dyldLoadHandle);
}
/*
*----------------------------------------------------------------------
*
* TclGuessPackageName --
*
|
| ︙ | | | ︙ | |