xref: /aosp_15_r20/build/soong/symbol_inject/cmd/symbol_inject.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage main
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"flag"
19*333d2b36SAndroid Build Coastguard Worker	"fmt"
20*333d2b36SAndroid Build Coastguard Worker	"os"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/symbol_inject"
23*333d2b36SAndroid Build Coastguard Worker)
24*333d2b36SAndroid Build Coastguard Worker
25*333d2b36SAndroid Build Coastguard Workervar (
26*333d2b36SAndroid Build Coastguard Worker	input  = flag.String("i", "", "input file")
27*333d2b36SAndroid Build Coastguard Worker	output = flag.String("o", "", "output file")
28*333d2b36SAndroid Build Coastguard Worker	symbol = flag.String("s", "", "symbol to inject into")
29*333d2b36SAndroid Build Coastguard Worker	from   = flag.String("from", "", "optional existing value of the symbol for verification")
30*333d2b36SAndroid Build Coastguard Worker	value  = flag.String("v", "", "value to inject into symbol")
31*333d2b36SAndroid Build Coastguard Worker
32*333d2b36SAndroid Build Coastguard Worker	dump = flag.Bool("dump", false, "dump the symbol table for copying into a test")
33*333d2b36SAndroid Build Coastguard Worker)
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workerfunc main() {
36*333d2b36SAndroid Build Coastguard Worker	flag.Parse()
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker	usageError := func(s string) {
39*333d2b36SAndroid Build Coastguard Worker		fmt.Fprintln(os.Stderr, s)
40*333d2b36SAndroid Build Coastguard Worker		flag.Usage()
41*333d2b36SAndroid Build Coastguard Worker		os.Exit(1)
42*333d2b36SAndroid Build Coastguard Worker	}
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Worker	if *input == "" {
45*333d2b36SAndroid Build Coastguard Worker		usageError("-i is required")
46*333d2b36SAndroid Build Coastguard Worker	}
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	if !*dump {
49*333d2b36SAndroid Build Coastguard Worker		if *output == "" {
50*333d2b36SAndroid Build Coastguard Worker			usageError("-o is required")
51*333d2b36SAndroid Build Coastguard Worker		}
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Worker		if *symbol == "" {
54*333d2b36SAndroid Build Coastguard Worker			usageError("-s is required")
55*333d2b36SAndroid Build Coastguard Worker		}
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker		if *value == "" {
58*333d2b36SAndroid Build Coastguard Worker			usageError("-v is required")
59*333d2b36SAndroid Build Coastguard Worker		}
60*333d2b36SAndroid Build Coastguard Worker	}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Worker	r, err := os.Open(*input)
63*333d2b36SAndroid Build Coastguard Worker	if err != nil {
64*333d2b36SAndroid Build Coastguard Worker		fmt.Fprintln(os.Stderr, err.Error())
65*333d2b36SAndroid Build Coastguard Worker		os.Exit(2)
66*333d2b36SAndroid Build Coastguard Worker	}
67*333d2b36SAndroid Build Coastguard Worker	defer r.Close()
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Worker	if *dump {
70*333d2b36SAndroid Build Coastguard Worker		err := symbol_inject.DumpSymbols(r)
71*333d2b36SAndroid Build Coastguard Worker		if err != nil {
72*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintln(os.Stderr, err.Error())
73*333d2b36SAndroid Build Coastguard Worker			os.Exit(6)
74*333d2b36SAndroid Build Coastguard Worker		}
75*333d2b36SAndroid Build Coastguard Worker		return
76*333d2b36SAndroid Build Coastguard Worker	}
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Worker	w, err := os.OpenFile(*output, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
79*333d2b36SAndroid Build Coastguard Worker	if err != nil {
80*333d2b36SAndroid Build Coastguard Worker		fmt.Fprintln(os.Stderr, err.Error())
81*333d2b36SAndroid Build Coastguard Worker		os.Exit(3)
82*333d2b36SAndroid Build Coastguard Worker	}
83*333d2b36SAndroid Build Coastguard Worker	defer w.Close()
84*333d2b36SAndroid Build Coastguard Worker
85*333d2b36SAndroid Build Coastguard Worker	file, err := symbol_inject.OpenFile(r)
86*333d2b36SAndroid Build Coastguard Worker	if err != nil {
87*333d2b36SAndroid Build Coastguard Worker		fmt.Fprintln(os.Stderr, err.Error())
88*333d2b36SAndroid Build Coastguard Worker		os.Exit(4)
89*333d2b36SAndroid Build Coastguard Worker	}
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker	err = symbol_inject.InjectStringSymbol(file, w, *symbol, *value, *from)
92*333d2b36SAndroid Build Coastguard Worker	if err != nil {
93*333d2b36SAndroid Build Coastguard Worker		fmt.Fprintln(os.Stderr, err.Error())
94*333d2b36SAndroid Build Coastguard Worker		os.Remove(*output)
95*333d2b36SAndroid Build Coastguard Worker		os.Exit(5)
96*333d2b36SAndroid Build Coastguard Worker	}
97*333d2b36SAndroid Build Coastguard Worker
98*333d2b36SAndroid Build Coastguard Worker	if file.IsMachoFile {
99*333d2b36SAndroid Build Coastguard Worker		err = symbol_inject.CodeSignMachoFile(*output)
100*333d2b36SAndroid Build Coastguard Worker		if err != nil {
101*333d2b36SAndroid Build Coastguard Worker			fmt.Fprintln(os.Stderr, err.Error())
102*333d2b36SAndroid Build Coastguard Worker			os.Remove(*output)
103*333d2b36SAndroid Build Coastguard Worker			os.Exit(6)
104*333d2b36SAndroid Build Coastguard Worker		}
105*333d2b36SAndroid Build Coastguard Worker	}
106*333d2b36SAndroid Build Coastguard Worker}
107