summaryrefslogtreecommitdiff
path: root/solenv/bin/modules/installer/splitdbg.pm
blob: 60c0c1bde024cfe53a031da16c1f4e3671178a14 (plain)
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;