view src/unexsol2.c @ 2365:ce4aa0ef8af1

[xemacs-hg @ 2004-11-04 07:48:14 by ben] Major work on internals manual. Rearranged many chapters so as to lie in coherent divisions. Add tons of stuff to Future Work, Old Future Work, Discussions. Add lots of stuff to Mule section (Multilingual ...). Remove index.texi, incorporate into internals.texi. Section on early history and an introduction. Section on XEmacs split. Lots of new MS Windows docs Mostly recently: Windows-I18N docs. Lots if new I18N docs. Loads of other stuff. .
author ben
date Thu, 04 Nov 2004 07:48:14 +0000
parents 04bc9d2f42c7
children
line wrap: on
line source

/* Unexec function for Solaris 2.x
   Copyright (C) 1994 Sun Microsystems, Inc.

This file is part of XEmacs.

XEmacs is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.

XEmacs is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with XEmacs; see the file COPYING.  If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

/* Synched up with: Not in FSF. */

/* #pragma ident "@(#) $Id: unexsol2.c,v 1.4 2004/09/20 19:20:07 james Exp $" */

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
#include "compiler.h"

#define DYNODUMP_SO	"../dynodump/dynodump.so"
#define DYNODUMP_SYM	"dynodump"

int unexec (char *new_name, char *old_name, unsigned int data_start,
	    unsigned int bss_start, unsigned int entry_address);
int
unexec(char *new_name, char *UNUSED (old_name),
       unsigned int UNUSED (data_start), unsigned int UNUSED (bss_start),
       unsigned int UNUSED (entry_address))
{
  void *handle;
  void (*func)(const char *file);

  if ((handle = dlopen (DYNODUMP_SO, RTLD_LAZY)) == NULL)
    {
      fprintf (stderr, "unexec(): dlopen(%s): %s\n",
	       (char *) DYNODUMP_SO, dlerror());
      exit (1);
    }

  if ((func = (void (*)(const char *)) dlsym (handle, DYNODUMP_SYM)) == NULL)
    {
      fprintf (stderr, "unexec(): dlsym(%s): %s \n",
	       (char *) DYNODUMP_SYM, dlerror());
      exit (1);
    }

  (*func)(new_name);

  dlclose (handle);

  return 0;
}