#!/usr/bin/perl -w use Getopt::Long; &GetOptions(32=>\$m32, 64=>\$m64, "output=s"=>\$mod); $#ARGV >= 0 or die "usage: compile-for-static-user-level-injection.pl [-32|-64] [--output=module_name] source.c+ [lib.a]*\n"; if (!$m32 && !$m64) { print "Assuming 32 bit. Use -64 to override\n"; $m32=1; } if (!$mod) { print "No module name given, assuming a.tooth\n"; $mod = "a.tooth"; } if ($m32) { $gopt = "-m32"; $lopt = "-melf_i386 --oformat elf32-i386"; } if ($m64) { $gopt = "-m64"; $lopt = "-melf_x86_64 --oformat elf64-x86-64"; } $linkerscript = <.linker_script"); print W $linkerscript; close(W); print "Linking...\n"; $rc=system("ld $lopt -z max-page-size=4096 -T .linker_script ".join(" ",map { "$_.o" } @stems)." ".join(" ",@libs)." -o $mod\n"); unlink ".linker_script"; $rc==0 or die "Linking of $mod failed\n"; print "Linking of $mod completed. Done.\n"; open(E,"readelf -h $mod |"); while () { if (/^\s*Entry point address:\s+(\S+)$/) { print "Entry point relative to beginning of file: $1\n"; last; } } close(E);