#!/usr/bin/perl -w

use strict;
use 5.008;			# for safe pipe opens using list form of open

use Fcntl qw(SEEK_SET);
use FileHandle;


########################################################################


die "Usage: $0 [--require] <section-name> [<executable> | <object> | <library>] ...\n" unless @ARGV >= 2;

my $require = 0;
if ($ARGV[0] eq '--require') {
    $require = 1;
    shift;
}

my $sectionName = shift;

foreach my $name (@ARGV) {
    my $objdump = new FileHandle;
    open $objdump, '-|', 'objdump', '-h', '-w', $name
	or die "cannot run objdump: $!\n";

    my $size;
    my $offset;
    while (<$objdump>) {
	my @field = split;
	next unless @field >= 7;
	next unless $field[1] eq $sectionName;
	next unless $field[0] =~ /^\d+$/;
	$size = hex $field[2];
	$offset = hex $field[5];
	last;
    }

    unless (defined $offset) {
	my $message = "\"$sectionName\" section is missing\n";
	if ($require) {
	    die $message;
	} else {
	    warn $message;
	    next;
	}
    }

    unless ($size) {
	warn "\"$sectionName\" section is empty\n";
	next;
    }

    my $buffer;
    my $executable = new FileHandle $name, 'r';
    $executable->seek($offset, &SEEK_SET);
    $executable->read($buffer, $size);
    $buffer =~ s/\0//g;
    print $buffer;
}
