Skip to main content
  • Home
  • login
  • Browse the archive

    swh mirror partner logo
swh logo
SoftwareHeritage
Software
Heritage
Mirror
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

  • 090a565
  • /
  • ms
  • /
  • segrenam.pl
Raw File
Permalinks

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • content
  • directory
content badge Iframe embedding
swh:1:cnt:2ab22a045944a5f6a4eb9888dc0e66f25b03d01d
directory badge Iframe embedding
swh:1:dir:f498e5905d9b3da67130a3ed5169c362d35802e5
segrenam.pl
#!/usr/bin/env perl

my $quiet = 1;

unpack("L",pack("N",1))!=1 || die "only little-endian hosts are supported";

# first argument can specify custom suffix...
$suffix=(@ARGV[0]=~/^\$/) ? shift(@ARGV) : "\$m";
#################################################################
# rename segments in COFF modules according to %map table below	#
%map=(	".text" => "fipstx$suffix",				#
	".text\$"=> "fipstx$suffix",				#
	".rdata"=> "fipsrd$suffix",				#
	".data" => "fipsda$suffix"	);			#
#################################################################

# collect file list
foreach (@ARGV) {
    if (/\*/)	{ push(@files,glob($_)); }
    else	{ push(@files,$_);       }
}

use Fcntl;
use Fcntl ":seek";

foreach (@files) {
    $file=$_;
    print "processing $file\n" unless $quiet;

    sysopen(FD,$file,O_RDWR|O_BINARY) || die "sysopen($file): $!";

    # read IMAGE_DOS_HEADER
    sysread(FD,$mz,64)==64 || die "$file is too short";
    @dos_header=unpack("a2C58I",$mz);
    if (@dos_header[0] eq "MZ") {
	$e_lfanew=pop(@dos_header);
	sysseek(FD,$e_lfanew,SEEK_SET)	|| die "$file is too short";
	sysread(FD,$Magic,4)==4		|| die "$file is too short";
	unpack("I",$Magic)==0x4550	|| die "$file is not COFF image";
    } elsif ($file =~ /\.obj$/i) {
	# .obj files have no IMAGE_DOS_HEADER
	sysseek(FD,0,SEEK_SET)		|| die "unable to rewind $file";
    } else { next; }

    # read IMAGE_FILE_HEADER
    sysread(FD,$coff,20)==20 || die "$file is too short";
    ($Machine,$NumberOfSections,$TimeDateStamp,
     $PointerToSymbolTable,$NumberOfSysmbols,
     $SizeOfOptionalHeader,$Characteristics)=unpack("SSIIISS",$coff);

    # skip over IMAGE_OPTIONAL_HEADER
    sysseek(FD,$SizeOfOptionalHeader,SEEK_CUR) || die "$file is too short";

    # traverse IMAGE_SECTION_HEADER table
    for($i=0;$i<$NumberOfSections;$i++) {
	sysread(FD,$SectionHeader,40)==40 || die "$file is too short";
	($Name,@opaque)=unpack("Z8C*",$SectionHeader);
	if ($map{$Name}) {
	    sysseek(FD,-40,SEEK_CUR) || die "unable to rewind $file";
	    syswrite(FD,pack("a8C*",$map{$Name},@opaque))==40 || die "syswrite failed: $!";
	    printf "    %-8s -> %.8s\n",$Name,$map{$Name} unless $quiet;
	}
    }
    close(FD);
}

ENEA — Copyright (C), ENEA. License: GNU AGPLv3+.
Legal notes  ::  JavaScript license information ::  Web API

back to top