our @EXPORT = qw(SEG_UNDEF SEG_TEXT SEG_DATA SEG_BSS);
include_elf
=> [qw(.rodata)],
elfname_out
=> '.text .rodata',
our %RevNames = map { ( $Segments{$_}{name
}, $_) } keys %Segments;
{ defined $Segments{$_}{elfname
} ?
( $Segments{$_}{elfname
}, $Segments{$_}{name
} ) : () } keys %Segments;
foreach my $code (keys %Segments) {
next unless exists $Segments{$code}{include_elf
};
foreach my $included (@
{$Segments{$code}{include_elf
}}) {
$ElfNames{$included} = $Segments{$code}{name
};
{ ( $Segments{$_}{link_suffix
}, $Segments{$_}{name
} ) } keys %Segments;
# rodata must appear before text or the linker will merge them
#our @Names = qw(rodata text data bss);
our @Names = qw(text data bss);
my @keys = keys %Segments;
fatal
"In Midas::Segment, @Names is incomplete.\n", M_CODE
;
} elsif(@Names > @keys) {
fatal
"In Midas::Segment, @Names has extra entry\n", M_CODE
;
foreach my $name (@Names) {
fatal
"Segment name '$name' is not set up correctly in Midas::Segment\n",
M_CODE
unless exists $RevNames{$name};
###############################################################################
$type = $class->name2type($type) if $type =~ /[a-zA-Z]/;
my $classtype = ref $class;
$this = fields
::new
($classtype);
$this->{type
} = $class->type() if defined $class->type();
$this = fields
::new
($class);
$this->{type
} = $type if defined $type;
###############################################################################
fatal Carp
::longmess
("No such segment type '$set'.\n"), M_CODE
unless exists $Segments{$set}{name
};
###############################################################################
$this->type($this->name2type($set));
return $this->type2name($this->{type
});
###############################################################################
###############################################################################
return 1 if exists $RevNames{$name};
###############################################################################
fatal Carp
::longmess
("No such segment name '$name'.\n"), M_CODE
unless exists $RevNames{$name};
###############################################################################
fatal Carp
::longmess
("No such segment name '$name'.\n"), M_CODE
unless exists $RevNames{$name};
return $Segments{$RevNames{$name}}{va_name
};
###############################################################################
fatal Carp
::longmess
("No such segment name '$name'.\n"), M_CODE
unless exists $RevNames{$name};
return exists $Segments{$RevNames{$name}}{elfname_out
} ?
$Segments{$RevNames{$name}}{elfname_out
} :
$Segments{$RevNames{$name}}{elfname
};
###############################################################################
fatal Carp
::longmess
("No such segment name '$name'.\n"), M_CODE
unless exists $RevNames{$name};
return $Segments{$RevNames{$name}}{link_suffix
};
###############################################################################
fatal Carp
::longmess
("No such segment type '$type'.\n"), M_CODE
unless exists $Segments{$type}{name
};
return $Segments{$type}{name
};
###############################################################################
###############################################################################
return map { $Segments{$_}{va_name
} } keys %Segments;
###############################################################################
###############################################################################