~hilaire-fernandes/drgeo/trunk

« back to all changes in this revision

Viewing changes to VMs/iPad/source/unix/vm/dlfcn-dyld.c

  • Committer: Hilaire Fernandes
  • Date: 2012-01-27 21:15:40 UTC
  • Revision ID: hilaire.fernandes@gmail.com-20120127211540-912spf97bhpx6mve
Initial additions

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* dlfcn-dyld.c -- provides dlopen() and friends as wrappers around Mach dyld
 
2
 * 
 
3
 * Author: Ian.Piumarta@INRIA.Fr
 
4
 * 
 
5
 *   Copyright (C) 1996-2006 by Ian Piumarta and other authors/contributors
 
6
 *                              listed elsewhere in this file.
 
7
 *   All rights reserved.
 
8
 *   
 
9
 *   This file is part of Unix Squeak.
 
10
 * 
 
11
 *   Permission is hereby granted, free of charge, to any person obtaining a copy
 
12
 *   of this software and associated documentation files (the "Software"), to deal
 
13
 *   in the Software without restriction, including without limitation the rights
 
14
 *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 
15
 *   copies of the Software, and to permit persons to whom the Software is
 
16
 *   furnished to do so, subject to the following conditions:
 
17
 * 
 
18
 *   The above copyright notice and this permission notice shall be included in
 
19
 *   all copies or substantial portions of the Software.
 
20
 * 
 
21
 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 
22
 *   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 
23
 *   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 
24
 *   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 
25
 *   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 
26
 *   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 
27
 *   SOFTWARE.
 
28
 * 
 
29
 * Last edited: 2009-08-19 04:17:17 by piumarta on emilia-2.local
 
30
 */
 
31
 
 
32
#include <stdio.h>
 
33
#include <stdarg.h>
 
34
#include <mach-o/dyld.h>
 
35
 
 
36
#define RTLD_NOW        0
 
37
#define RTLD_GLOBAL     0
 
38
 
 
39
#define DL_APP_CONTEXT  ((void *)-1)
 
40
 
 
41
static char dlErrorString[256];
 
42
static int  dlErrorSet= 0;
 
43
 
 
44
 
 
45
static void dlSetError(const char *fmt, ...)
 
46
{
 
47
  va_list ap;
 
48
  va_start(ap, fmt);
 
49
  vsnprintf(dlErrorString, sizeof(dlErrorString), fmt, ap);
 
50
  va_end(ap);
 
51
  dlErrorSet= 1;
 
52
}
 
53
 
 
54
 
 
55
static const char *dlerror(void)
 
56
{
 
57
  if (dlErrorSet)
 
58
    {
 
59
      dlErrorSet= 0;
 
60
      return (const char *)dlErrorString;
 
61
    }
 
62
  return 0;
 
63
}
 
64
 
 
65
 
 
66
static void dlUndefined(const char *symbol)
 
67
{
 
68
  fprintf(stderr, "dyld: undefined symbol: %s\n", symbol);
 
69
}
 
70
 
 
71
static NSModule dlMultiple(NSSymbol s, NSModule oldModule, NSModule newModule)
 
72
{
 
73
  fdebugf((stderr, "dyld: %s: %s previously defined in %s, new definition in %s\n",
 
74
           NSNameOfSymbol(s), NSNameOfModule(oldModule), NSNameOfModule(newModule)));
 
75
  return newModule;
 
76
}
 
77
 
 
78
static void dlLinkEdit(NSLinkEditErrors errorClass, int errorNumber,
 
79
                       const char *fileName, const char *errorString)
 
80
 
 
81
{
 
82
  fprintf(stderr, "dyld: %s: %s\n", fileName, errorString);
 
83
}
 
84
 
 
85
static NSLinkEditErrorHandlers errorHandlers=
 
86
  {
 
87
    dlUndefined,
 
88
    dlMultiple,
 
89
    dlLinkEdit
 
90
  };
 
91
 
 
92
static void dlinit(void)
 
93
{
 
94
  NSInstallLinkEditErrorHandlers(&errorHandlers);
 
95
}
 
96
 
 
97
static int dlInitialised= 0;
 
98
 
 
99
 
 
100
static void *dlopen(const char *path, int mode)
 
101
{
 
102
  void                  *handle= 0;
 
103
  NSObjectFileImage      ofi= 0;
 
104
 
 
105
  if (!dlInitialised)
 
106
    {
 
107
      dlinit();
 
108
      dlInitialised= 1;
 
109
    }
 
110
 
 
111
  if (!path)
 
112
    return DL_APP_CONTEXT;
 
113
 
 
114
  switch (NSCreateObjectFileImageFromFile(path, &ofi))
 
115
    {
 
116
    case NSObjectFileImageSuccess:
 
117
      handle= NSLinkModule(ofi, path, NSLINKMODULE_OPTION_RETURN_ON_ERROR);
 
118
      NSDestroyObjectFileImage(ofi);
 
119
      break;
 
120
    case NSObjectFileImageInappropriateFile:
 
121
      handle= (void *)NSAddImage(path, NSADDIMAGE_OPTION_RETURN_ON_ERROR);
 
122
      break;
 
123
    default:
 
124
      handle= 0;
 
125
      break;
 
126
    }
 
127
 
 
128
  if (!handle)
 
129
    dlSetError("could not load shared object: %s", path);
 
130
 
 
131
  fdebugf((stderr, "dlopen: %s => %d\n", path, (int)handle));
 
132
 
 
133
  return handle;
 
134
}
 
135
 
 
136
 
 
137
static void *dlsym(void *handle, const char *symbol)
 
138
{
 
139
  char          _symbol[256];
 
140
  NSSymbol      *nsSymbol= 0;
 
141
 
 
142
  snprintf(_symbol, sizeof(_symbol), "_%s", symbol);
 
143
 
 
144
  fdebugf((stderr, "dlsym: looking for %s (%s) in %d\n", symbol, _symbol, (int)handle));
 
145
 
 
146
  if (!handle)
 
147
    {
 
148
      fdebugf((stderr, "dlsym: setting app context for this handle\n"));
 
149
      handle= DL_APP_CONTEXT;
 
150
    }
 
151
 
 
152
  if (DL_APP_CONTEXT == handle)
 
153
    {
 
154
      fdebugf((stderr, "dlsym: looking in app context\n"));
 
155
      if (NSIsSymbolNameDefined(_symbol))
 
156
        nsSymbol= NSLookupAndBindSymbol(_symbol);
 
157
    }
 
158
  else
 
159
    {
 
160
      if ((  (MH_MAGIC == ((struct mach_header *)handle)->magic))       /* ppc */
 
161
          || (MH_CIGAM == ((struct mach_header *)handle)->magic))       /* 386 */
 
162
        {
 
163
          if (NSIsSymbolNameDefinedInImage((struct mach_header *)handle, _symbol))
 
164
            {
 
165
              nsSymbol= NSLookupSymbolInImage
 
166
                ((struct mach_header *)handle,
 
167
                 _symbol,
 
168
                 NSLOOKUPSYMBOLINIMAGE_OPTION_BIND
 
169
                 /*| NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR*/);
 
170
              fdebugf((stderr, "dlsym: bundle (image) lookup returned %p\n", nsSymbol));
 
171
            }
 
172
          else
 
173
            fdebugf((stderr, "dlsym: bundle (image) symbol not defined\n"));
 
174
        }
 
175
      else
 
176
        {
 
177
          nsSymbol= NSLookupSymbolInModule(handle, _symbol);
 
178
          fdebugf((stderr, "dlsym: dylib (module) lookup returned %p\n", nsSymbol));
 
179
        }
 
180
    }
 
181
 
 
182
  if (!nsSymbol)
 
183
    {
 
184
      dlSetError("symbol not found: %s", _symbol);
 
185
      return 0;
 
186
    }
 
187
 
 
188
  return NSAddressOfSymbol(nsSymbol);
 
189
}
 
190
 
 
191
 
 
192
static int dlclose(void *handle)
 
193
{
 
194
  if ((  (MH_MAGIC == ((struct mach_header *)handle)->magic))   /* ppc */
 
195
      || (MH_CIGAM == ((struct mach_header *)handle)->magic))   /* 386 */
 
196
    return 0;   /* can't unlink, but pretend we did */
 
197
 
 
198
  if (!NSUnLinkModule(handle, 0))
 
199
    {
 
200
      dlSetError("could not unlink shared object: %s", NSNameOfModule(handle));
 
201
      return -1;
 
202
    }
 
203
 
 
204
  return 0;
 
205
}
 
206
 
 
207
 
 
208
/* autoconf has bugs */
 
209
 
 
210
#ifdef HAVE_DLFCN_H
 
211
# undef HAVE_DLFCN_H
 
212
#endif
 
213
 
 
214
#ifndef HAVE_DLOPEN
 
215
# define HAVE_DLOPEN 1
 
216
#endif