mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-19 12:59:21 +08:00
98d10e5fd2
A recent change in binutils marks the .gnu_debuglink_overlay section as debug section. When dllfixdbg calls objcopy -g, the section is removed and the --add-gnu-debuglink option on the same command line appends the section consequentially at the end of the sections. This in turn breaks Windows Version info and, potentially, raising the cygheap size at runtime. Fix this by adding an explicit --keep-section=.gnu_debuglink_overlay to the objcopy command line. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
75 lines
2.3 KiB
Perl
Executable File
75 lines
2.3 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
#
|
|
# This file is part of Cygwin.
|
|
#
|
|
# This software is a copyrighted work licensed under the terms of the
|
|
# Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
|
# details.
|
|
#
|
|
use integer;
|
|
use strict;
|
|
sub xit($@);
|
|
my $strip = $ARGV[0] eq '-s';
|
|
shift if $strip;
|
|
my $objdump = shift;
|
|
my @objcopy = ((shift));
|
|
my $dll = shift;
|
|
my $dbg = shift;
|
|
xit 0, @objcopy, '-R', '.gnu_debuglink_overlay', '--add-gnu-debuglink=/dev/null', '--only-keep-debug', $dll, $dbg;
|
|
xit 0, @objcopy, '-g', '--keep-section=.gnu_debuglink_overlay', '--add-gnu-debuglink=' . $dbg, $dll;
|
|
open(OBJDUMP, '-|', "$objdump --headers $dll");
|
|
my %section;
|
|
while (<OBJDUMP>) {
|
|
my ($idx, $name, $size, $vma, $lma, $fileoff, $algn) = /^\s*(\d+)\s+(\.\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s*$/;
|
|
if ($name eq '.gnu_debuglink') {
|
|
push(@objcopy, '--set-section-flag', '.gnu_debuglink=contents,readonly,debug,noload');
|
|
$idx = $section{'.gnu_debuglink'}{-idx} if defined($section{'.gnu_debuglink'}{-idx});
|
|
} elsif ($name eq '.gnu_debuglink_overlay') {
|
|
push (@objcopy, '-R', '.gnu_debuglink_overlay');
|
|
$section{'.gnu_debuglink'}{-idx} = $idx;
|
|
next;
|
|
}
|
|
defined($idx) and
|
|
$section{$name} = {-idx=>int($idx), -size=>hex($size), -vma=>hex($vma), -lma=>hex($lma), -fileoff=>hex($fileoff),
|
|
-algn=>0x00001000};
|
|
}
|
|
close OBJDUMP;
|
|
my $vma;
|
|
for my $k (sort {$section{$a}{-idx} <=> $section{$b}{-idx}} keys %section) {
|
|
if ($strip && $k =~ /\.(?:stab|debug)/o) {
|
|
push(@objcopy, '-R', $k);
|
|
next;
|
|
}
|
|
if (!defined($vma)) {
|
|
$vma = $section{$k}{-vma};
|
|
}
|
|
if ($vma != $section{$k}{-vma}) {
|
|
my $newvma = align($vma, $section{$k}{-algn});
|
|
if ($newvma != $vma) {
|
|
printf STDERR "$0: ERROR $k VMA 0x%08x != 0x%08x\n", $vma, $newvma;
|
|
exit 1;
|
|
}
|
|
push(@objcopy, '--change-section-address', sprintf "$k=0x%08x", $vma);
|
|
}
|
|
$vma = align($vma + $section{$k}{-size}, $section{$k}{-algn});
|
|
}
|
|
|
|
warn "$0: ERROR final VMA (" . sprintf("0x%08x", $vma) . ") not on 64K boundary\n" if $vma != align($vma, 64 * 1024);
|
|
push(@objcopy, $dll, @ARGV);
|
|
xit 1, @objcopy;
|
|
sub align {
|
|
my $n = $_[0];
|
|
my $align = $_[1] - 1;
|
|
return ($n + $align) & ~$align;
|
|
}
|
|
|
|
sub xit($@) {
|
|
my $execit = shift;
|
|
print "+ @_\n";
|
|
if ($execit) {
|
|
exec @_ or die "$0: couldn't exec $_[0] - $!\n";
|
|
} else {
|
|
system @_ and die "$0: couldn't exec $_[0] - $!\n";
|
|
}
|
|
}
|