Node:spld examples, Previous:All-in-one Executables, Up:The Application Builder



Examples

  1. The character-based SICStus development system executable (sicstus) can be created using
    % spld --main=prolog -o sicstus
    

    This will create a development system which is dynamically linked and has no pre-linked foreign resources.


  2. % spld --static -D --resources=random -o main -ltk8.0 -ltcl8.0
    

    This will create a statically linked executable called main which has the resource random pre-linked (statically). The linker will receive -ltk8.0 -ltcl8.0 which will work under UNIX (if Tcl/Tk is installed correctly) but will probably fail under Windows.

  3. The following is a little more advanced example demonstrating two things. One is how to use the --userhook option to perform initializations in development systems before SP_initialize() is called. It also demonstrates how to use this mechanism to redefine the memory manager bottom layer.
    /* --------------------------------------------------------------
     * userhook.c - an example of how to use SU_initialize() to
     *              define your own memory manager bottom layer.
     *
     * The following commands create a sicstus-executable 'msicstus'
     * which uses malloc() as its own memory manager bottom layer.
     * This is more or less equivalent to specifying "-m" to the
     * regular 'sicstus' executable, except that these memory hooks
     * print out messages when they are called.
     * --------------------------------------------------------------
     */
    #include <stdio.h>
    #include <stdlib.h>
    #include <sicstus/sicstus.h>
    
    /* for mallopt() */
    #ifdef linux
    #include <malloc.h>
    #endif
    
    void *
    my_alloc_hook (unsigned int size,
                   unsigned int align,
                   unsigned int *actual_size)
    {
      void *mem;
    
      printf ("Inside my_alloc_hook(%d,%d,%p) -> ",
              size, align, actual_size);
    
      if (align > sizeof (double))
          size += align;
    
      mem = malloc (size);
      *actual_size = size;
      if (mem)
        printf ("%p\n", mem);
      else
        printf ("NULL (malloc failed to allocate memory)\n");
    
      return mem;
    }
    
    void *
    my_init_alloc_hook (unsigned int size,
                        unsigned int align,
                        unsigned int *actual_size)
    {
      printf ("Inside my_init_alloc_hook(%d,%d,%p)\n",
              size, align, actual_size);
    
      /* Do not use MMAP on Linux. */
    #ifdef linux
      mallopt (M_MMAP_MAX, 0);
    #endif
    
      return my_alloc_hook (size, align, actual_size);
    }
    
    void *
    my_realloc_hook (void *ptr,
                     unsigned int oldsize,
                     unsigned int newsize,
                     unsigned int align,
                     unsigned int *actual_size)
    {
      void *mem;
    
      printf ("Inside my_realloc_hook(%p,%d,%d,%d,%p) -> ",
              ptr, oldsize, newsize, align, actual_size);
    
      if (align > sizeof (double))
          newsize += align;
    
      mem = realloc (ptr, newsize);
      *actual_size = newsize;
      if (mem)
        printf ("%p\n", mem);
      else
        printf ("NULL (realloc() failed to re-allocate memory)\n");
    
      return mem;
    }
    
    int
    my_free_hook (void *ptr, unsigned int size)
    {
      printf ("Inside my_free_hook(%p,%d)\n", ptr, size);
    
      free (ptr);
      return 1;
    }
    
    /* Entry point for initializations to be done before SP_initialize() */
    int
    SU_initialize (int argc, char **argv)
    {
      SP_set_memalloc_hooks (MM_USE_OTHER,
                             my_init_alloc_hook,
                             my_alloc_hook,
                             my_realloc_hook,
                             my_free_hook);
      return 0;
    }
    

    Compile userhook.c like this:

    % spld -D --userhook userhook.c -o ./msicstus
    Created "./msicstus"
    % ./msicstus
    Inside my_init_alloc_hook(524304,8,0xbfffc318)
    Inside my_alloc_hook(524304,8,0xbfffc318) -> 0x804b920
    Inside my_alloc_hook(65536,8,0xbfff019c) -> 0x80cba38
    Inside my_alloc_hook(65536,8,0xbfff019c) -> 0x80dba40
    Inside my_alloc_hook(65536,8,0xbfff00d0) -> 0x80eba48
    Inside my_alloc_hook(65544,8,0xbfff0110) -> 0x80fba50
    Inside my_alloc_hook(65536,8,0xbfff019c) -> 0x810ba60
    Inside my_alloc_hook(65536,8,0xbfff00f4) -> 0x811ba68
    Inside my_alloc_hook(65536,8,0xbfff019c) -> 0x812ba70
    Inside my_alloc_hook(65536,8,0xbfff019c) -> 0x813ba78
    Inside my_alloc_hook(65536,8,0xbfff019c) -> 0x814ba80
    Inside my_alloc_hook(65536,8,0xbfff019c) -> 0x815ba88
    Inside my_alloc_hook(65536,8,0xbfff019c) -> 0x816ba90
    SICStus 3.8b1 (x86-linux-glibc2.1): Fri Oct 29 11:24:24 CEST 1999
    Licensed to SICS
    Inside my_free_hook(0x80fba50,65544)
    | ?-