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;
}