Notizen zu Sun Solaris

Perl-Module und gcc

perl Makefile.PL CC=/usr/sfw/bin/gcc  CCCDLFLAGS=-fPIC LD=/usr/sfw/bin/gld  OPTIMIZE=-O2 CCFLAGS="-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_TS_ERRNO"
gmake
gmake install

LD_PRELOAD

Manchmal hat man ein 64bit-Solaris, aber einen 32bit gcc vor sich und demzufolge auch 32bit-Binaries. Dann möchte man mit LD_PRELOAD arbeiten - naja. LD_PRELOAD_32 hilft dann hin und wieder, wo LD_PRELOAD nur core-Dumps produziert ;-)

/bin/sh durch /usr/bin/bash ersetzen

Manche Software wird seltsam gebaut und setzt unter /bin/sh eine bash voraus. Was tun? Ein kleines bißchen LD_PRELOAD hilft da manchmal... Zuerst wie man kompiliert:
gcc -fPIC -Wall -g -O2 -shared -o sh_to_bash.so sh_to_bash.c -lc
export LD_PRELOAD_32=$PWD/sh_to_bash.so
und nun noch das sh_to_bash.c :-)
#define _REENTRANT

#include <dlfcn.h>

/* #include <unistd.h> */
#include <string.h>
#include <stdio.h>

static int (*orig_execve)();
const char *newpath = "/usr/bin/bash";
const char *oldpath = "/bin/sh";

#pragma init(iexecve_init)
#pragma weak execve=_execve

static void
iexecve_init()
{
        orig_execve = (int(*)())dlsym(RTLD_NEXT, "_execve");
}


int _execve(const char *path, char *const argv[], char *const envp[])
{
        int result;
        if ( !strcmp(path,oldpath) ) {
                /* printf("SUBSTITUTING: %s => %s\n",path,newpath); */
                result = orig_execve(newpath,argv,envp);
                return result;
        }
        result = orig_execve(path,argv,envp);
        return result;
}