Using LD_PRELOAD to make date return a specific date

Tom Evans at
Thu Apr 26 11:15:22 UTC 2007

On Tue, 2007-04-24 at 19:39 -0700, Kelly Jones wrote:
> I recently discovered LD_PRELOAD, a cool environment variable that
> lets a library "intercept" system calls. For example, setting
> LD_PRELOAD to /usr/lib/ lets tsocks intercept socket
> connections and redirect them to a SOCKS proxy.
> My question: how can I write a library that intercepts the
> gettimeofday() system call (or time() or whatever the 'date' command
> uses) and gets 'date' to return, say, "Thu Jan 1 00:00:00 UTC 1970"?
> I realize this involves a couple of steps (writing a C "library" for
> one), so any pointers are appreciated. My real intentions are more
> complex (and sinister <G>).

It's quite straightforward. /bin/date actually uses localtime(), not
gettimeofday(), but the principle is the same.

> $ cat localtime_hack.c 
#include <sys/types.h>
#include <time.h>

struct tm *
localtime(const time_t *clock)
    static struct tm tv;
    time_t epochal = 1;
    localtime_r(&epochal, &tv);
    return &tv;

> $ gcc -Wall -fpic -c -o localtime_hack.o localtime_hack.c

> $ gcc -shared -Wl,-soname, -o \ localtime_hack.o

> $ LD_PRELOAD="`pwd`/" /bin/date
Thu  1 Jan 1970 01:00:01 BST


-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: This is a digitally signed message part
Url :

More information about the freebsd-questions mailing list