aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/hw/xfree86/loader/loader.c
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server/hw/xfree86/loader/loader.c')
-rw-r--r--xorg-server/hw/xfree86/loader/loader.c145
1 files changed, 40 insertions, 105 deletions
diff --git a/xorg-server/hw/xfree86/loader/loader.c b/xorg-server/hw/xfree86/loader/loader.c
index fc0db2886..6a4c08916 100644
--- a/xorg-server/hw/xfree86/loader/loader.c
+++ b/xorg-server/hw/xfree86/loader/loader.c
@@ -74,41 +74,50 @@
#include "xf86.h"
#include "xf86Priv.h"
#include "compiler.h"
-#include "sym.h"
-/*
- * handles are used to identify files that are loaded. Even archives
- * are counted as a single file.
- */
+extern void *xorg_symbols[];
+
#define MAX_HANDLE 256
-#define HANDLE_FREE 0
-#define HANDLE_USED 1
-static char freeHandles[MAX_HANDLE];
static int refCount[MAX_HANDLE];
-/*
- * modules are used to identify compilation units (ie object modules).
- * Archives contain multiple modules, each of which is treated seperately.
- */
static int moduleseq = 0;
/* Prototypes for static functions. */
-static loaderPtr _LoaderListPush(void);
-static loaderPtr _LoaderListPop(int);
+static loaderPtr listHead = NULL;
-void
-LoaderInit(void)
+static loaderPtr
+_LoaderListPush(void)
+{
+ loaderPtr item = calloc(1, sizeof(struct _loader));
+
+ item->next = listHead;
+ listHead = item;
+
+ return item;
+}
+
+static loaderPtr
+_LoaderListPop(int handle)
{
- const char *osname = NULL;
+ loaderPtr item = listHead;
+ loaderPtr *bptr = &listHead; /* pointer to previous node */
- char *ld_bind_now = getenv("LD_BIND_NOW");
- if (ld_bind_now && *ld_bind_now) {
- xf86Msg(X_ERROR, "LD_BIND_NOW is set, dlloader will NOT work!\n");
+ while (item) {
+ if (item->handle == handle) {
+ *bptr = item->next; /* remove this from the list */
+ return item;
+ }
+ bptr = &(item->next);
+ item = item->next;
}
- xf86MsgVerb(X_INFO, 2, "Loader magic: %p\n", (void *)
- ((long)dixLookupTab ^ (long)extLookupTab
- ^ (long)miLookupTab ^ (long)xfree86LookupTab));
+ return 0;
+}
+
+void
+LoaderInit(void)
+{
+ xf86MsgVerb(X_INFO, 2, "Loader magic: %p\n", (void *)xorg_symbols);
xf86MsgVerb(X_INFO, 2, "Module ABI versions:\n");
xf86ErrorFVerb(2, "\t%s: %d.%d\n", ABI_CLASS_ANSIC,
GET_ABI_MAJOR(LoaderVersionInfo.ansicVersion),
@@ -123,10 +132,6 @@ LoaderInit(void)
GET_ABI_MAJOR(LoaderVersionInfo.extensionVersion),
GET_ABI_MINOR(LoaderVersionInfo.extensionVersion));
- LoaderGetOS(&osname, NULL, NULL, NULL);
- if (osname)
- xf86MsgVerb(X_INFO, 2, "Loader running on %s\n", osname);
-
#if defined(__UNIXWARE__) && !defined(__GNUC__)
/* For UnixWare we need to load the C Runtime libraries which are
* normally auto-linked by the compiler. Otherwise we are bound to
@@ -149,58 +154,6 @@ LoaderInit(void)
#endif
}
-static loaderPtr listHead = (loaderPtr) 0;
-
-static loaderPtr
-_LoaderListPush()
-{
- loaderPtr item = calloc(1, sizeof(struct _loader));
-
- item->next = listHead;
- listHead = item;
-
- return item;
-}
-
-static loaderPtr
-_LoaderListPop(int handle)
-{
- loaderPtr item = listHead;
- loaderPtr *bptr = &listHead; /* pointer to previous node */
-
- while (item) {
- if (item->handle == handle) {
- *bptr = item->next; /* remove this from the list */
- return item;
- }
- bptr = &(item->next);
- item = item->next;
- }
-
- return 0;
-}
-
-/* These four are just ABI stubs */
-_X_EXPORT void
-LoaderRefSymbols(const char *sym0, ...)
-{
-}
-
-_X_EXPORT void
-LoaderRefSymLists(const char **list0, ...)
-{
-}
-
-_X_EXPORT void
-LoaderReqSymLists(const char **list0, ...)
-{
-}
-
-_X_EXPORT void
-LoaderReqSymbols(const char *sym0, ...)
-{
-}
-
/* Public Interface to the loader. */
int
@@ -214,12 +167,7 @@ LoaderOpen(const char *module, const char *cname, int handle,
ErrorF("LoaderOpen(%s)\n", module);
#endif
- /*
- * Check to see if the module is already loaded.
- * Only if we are loading it into an existing namespace.
- * If it is to be loaded into a new namespace, don't check.
- * Note: We only have one namespace.
- */
+ /* Is the module already loaded? */
if (handle >= 0) {
tmp = listHead;
while (tmp) {
@@ -249,7 +197,7 @@ LoaderOpen(const char *module, const char *cname, int handle,
* Find a free handle.
*/
new_handle = 1;
- while (new_handle < MAX_HANDLE && freeHandles[new_handle])
+ while (new_handle < MAX_HANDLE && refCount[new_handle])
new_handle++;
if (new_handle == MAX_HANDLE) {
@@ -261,7 +209,6 @@ LoaderOpen(const char *module, const char *cname, int handle,
return -1;
}
- freeHandles[new_handle] = HANDLE_USED;
refCount[new_handle] = 1;
tmp = _LoaderListPush();
@@ -275,7 +222,7 @@ LoaderOpen(const char *module, const char *cname, int handle,
if ((tmp->private = DLLoadModule(tmp, flags)) == NULL) {
xf86Msg(X_ERROR, "Failed to load %s\n", module);
_LoaderListPop(new_handle);
- freeHandles[new_handle] = HANDLE_FREE;
+ refCount[new_handle] = 0;
if (errmaj)
*errmaj = LDR_NOLOAD;
if (errmin)
@@ -292,26 +239,19 @@ LoaderHandleOpen(int handle)
if (handle < 0 || handle >= MAX_HANDLE)
return -1;
- if (freeHandles[handle] != HANDLE_USED)
+ if (!refCount[handle])
return -1;
refCount[handle]++;
return handle;
}
-_X_EXPORT void *
+void *
LoaderSymbol(const char *sym)
{
return (DLFindSymbol(sym));
}
-/* more stub */
-_X_EXPORT int
-LoaderCheckUnresolved(int delay_flag)
-{
- return 0;
-}
-
int
LoaderUnload(int handle)
{
@@ -331,18 +271,13 @@ LoaderUnload(int handle)
*/
while ((tmp = _LoaderListPop(handle)) != NULL) {
- if (strchr(tmp->name, ':') == NULL) {
- /* It is not a member of an archive */
- xf86Msg(X_INFO, "Unloading %s\n", tmp->name);
- }
+ xf86Msg(X_INFO, "Unloading %s\n", tmp->name);
DLUnloadModule(tmp->private);
free(tmp->name);
free(tmp->cname);
free(tmp);
}
- freeHandles[handle] = HANDLE_FREE;
-
return 0;
}
@@ -354,13 +289,13 @@ LoaderSetOptions(unsigned long opts)
LoaderOptions |= opts;
}
-_X_EXPORT Bool
+Bool
LoaderShouldIgnoreABI(void)
{
return (LoaderOptions & LDR_OPT_ABI_MISMATCH_NONFATAL) != 0;
}
-_X_EXPORT int
+int
LoaderGetABIVersion(const char *abiclass)
{
struct {