Howto write a Hurd library

Build the Hurd sources:

Refer to this example.

Create the library files:

Create a directory, say, libhello in the Hurd sources directory.

Create a lhello.h header file:

/* lhello.h - Example library header file.
   Copyright (C) 2006 Free Software Foundation, Inc.
   Written by Shakthi Kannan <shaks@shakthimaan.com>.

   This file is part of the GNU Hurd.

   The GNU Hurd 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.

   The GNU Hurd 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 the GNU Hurd; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */

#ifndef _HURD_HELLO_H
#define _HURD_HELLO_H   1

struct hello
{
  int x;
};

#endif  /* _HURD_HELLO_H */

Replace filename, year, author name and e-mail address appropriately.

Create a lhello.c file:

/* lhello.c - Example library .c file.
   Copyright (C) 2006
   Free Software Foundation, Inc.
   Written by Shakthi Kannan <shaks@shakthimaan.com>.

   This file is part of the GNU Hurd.

   The GNU Hurd 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.

   The GNU Hurd 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 the GNU Hurd; see the file COPYING.  If not, write to
   the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */

#include "lhello.h"

void 
print_hello (void)
{
  struct hello example;
  example.x = 2;
  printf ("foo and bar are %d words!\n", example.x);
} 

Replace header file year, author name and e-mail address appropriately.

Create a Makefile

#
#   Copyright (C) 2006 Free Software Foundation, Inc.
#
#   This file is part of the GNU Hurd.
#
#   The GNU Hurd 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.
#
#   The GNU Hurd 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 this program; if not, write to the Free Software
#   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

dir := libhello
makemode := library

libname := libhello
SRCS = lhello.c
installhdrs = lhello.h
LCLHDRS = $(installhdrs)

OBJS = $(SRCS:.c=.o)

include ../Makeconf

Update the Makeconf file:

Add libhello to lib-subdirs target in the top-level Makefile in the Hurd sources.

cd build
../configure
make

Testing the library

Write a file, say, foo.c:

/* foo.c */

#define _GNU_SOURCE

int
main (int argc, char *argv[])
{
  print_hello();
  return 0;
}

Static compilation and linking method:

gcc -g -o foo foo.c -L/path/to/libhello -lhello -static

Run the example:

./foo

Compilation and dynamic linking method:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/libhello
gcc -g -o foo foo.c -L/path/to/libhello -lhello

where /path/to/libhello = /path/to/hurd/build/libhello

Run the example:

./foo