1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
package installer::splitdbg;
use strict;
use warnings;
use base 'Exporter';
use installer::globals;
use installer::logger;
use installer::pathanalyzer;
use installer::systemactions;
our @EXPORT_OK = qw(splitdbg_libraries);
sub _need_to_splitdbg
{
my ( $filename ) = @_;
my $splitdbg = 0;
# Check using the "file" command
$filename =~ s/'/'\\''/g;
open (FILE, "file '$filename' |");
my $fileoutput = <FILE>;
close (FILE);
if (( $fileoutput =~ /not stripped/i ) && ( $fileoutput =~ /\bELF\b/ )) { $splitdbg = 1; }
return $splitdbg;
}
sub _do_splitdbg
{
my ( $filename ) = @_;
my $systemcall = "objcopy --only-keep-debug $filename $filename.dbg && ";
$systemcall .= "objcopy --strip-debug $filename && ";
$systemcall .= "objcopy --add-gnu-debuglink=$filename.dbg $filename";
my $returnvalue = system($systemcall);
my $infoline = "Systemcall: $systemcall\n";
push( @installer::globals::logfileinfo, $infoline);
if ($returnvalue)
{
$infoline = "ERROR: Could not split debug info of $filename!\n";
push( @installer::globals::logfileinfo, $infoline);
}
else
{
$infoline = "SUCCESS: Split debug info of $filename!\n";
push( @installer::globals::logfileinfo, $infoline);
}
}
sub splitdbg_libraries
{
my ( $filelist, $languagestringref ) = @_;
my @debugfilelist = ();
installer::logger::include_header_into_logfile("Splitting debuginfo from files:");
my $splitdbgdirbase = installer::systemactions::create_directories("splitdbg", $languagestringref);
if (! grep {$_ eq $splitdbgdirbase} @installer::globals::removedirs)
{
push(@installer::globals::removedirs, $splitdbgdirbase);
}
for ( my $i = 0; $i <= $#{$filelist}; $i++ )
{
my $sourcefilename = ${$filelist}[$i]->{'sourcepath'};
if ( _need_to_splitdbg($sourcefilename) )
{
my $shortfilename = $sourcefilename;
installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$shortfilename);
my $infoline = "Split debuginfo: $shortfilename\n";
push(@installer::globals::logfileinfo, $infoline);
# copy file into directory for split debuginfo libraries
my $onelanguage = ${$filelist}[$i]->{'specificlanguage'};
# files without language into directory "00"
if ($onelanguage eq "") { $onelanguage = "00"; }
my $splitdbgdir = $splitdbgdirbase . $installer::globals::separator . $onelanguage;
installer::systemactions::create_directory($splitdbgdir); # creating language specific subdirectories
my $destfilename = $splitdbgdir . $installer::globals::separator . $shortfilename;
installer::systemactions::copy_one_file($sourcefilename, $destfilename);
# change sourcepath in files collector
${$filelist}[$i]->{'sourcepath'} = $destfilename;
# split debuginfo from file
_do_splitdbg($destfilename);
push(@debugfilelist, ${$filelist}[$i]);
}
}
return \@debugfilelist;
}
1;
|