source: mainline/boot/tools/pack.py@ e19d667

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since e19d667 was e19d667, checked in by Martin Decky <martin@…>, 17 years ago

unify pack script

  • Property mode set to 100755
File size: 4.4 KB
Line 
1#!/usr/bin/env python
2#
3# Copyright (c) 2008 Martin Decky
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9#
10# - Redistributions of source code must retain the above copyright
11# notice, this list of conditions and the following disclaimer.
12# - Redistributions in binary form must reproduce the above copyright
13# notice, this list of conditions and the following disclaimer in the
14# documentation and/or other materials provided with the distribution.
15# - The name of the author may not be used to endorse or promote products
16# derived from this software without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28#
29"""
30Binary package creator
31"""
32
33import sys
34import os
35import subprocess
36
37def usage(prname):
38 "Print usage syntax"
39 print prname + " <OBJCOPY> <FORMAT> <OUTPUT_FORMAT> <ARCH> <ALIGNMENT>"
40
41def main():
42 if (len(sys.argv) < 6):
43 usage(sys.argv[0])
44 return
45
46 if (not sys.argv[5].isdigit()):
47 print "<ALIGNMENT> must be a number"
48 return
49
50 templatename = "_link.ld.in"
51 workdir = os.getcwd()
52 objcopy = sys.argv[1]
53 format = sys.argv[2]
54 output_format = sys.argv[3]
55 arch = sys.argv[4]
56 align = int(sys.argv[5], 0)
57
58 link = file("_link.ld", "w")
59 header = file("_components.h", "w")
60 data = file("_components.c", "w")
61
62 link.write("OUTPUT_FORMAT(\"" + output_format + "\")\n")
63 link.write("OUTPUT_ARCH(" + arch + ")\n")
64 link.write("ENTRY(start)\n\n")
65 link.write("SECTIONS {\n")
66
67 size = os.path.getsize(templatename)
68 rd = 0
69 template = file(templatename, "r")
70
71 while (rd < size):
72 buf = template.read(4096)
73 link.write(buf)
74 rd += len(buf)
75
76 template.close()
77
78 link.write("\n")
79
80 header.write("#ifndef ___COMPONENTS_H__\n")
81 header.write("#define ___COMPONENTS_H__\n\n")
82
83 data.write("#include \"_components.h\"\n\n")
84 data.write("void init_components(component_t *components)\n")
85 data.write("{\n")
86
87 cnt = 0
88 for task in sys.argv[6:]:
89 basename = os.path.basename(task)
90 plainname = os.path.splitext(basename)[0]
91 path = os.path.dirname(task)
92 object = plainname + ".o"
93 symbol = "_binary_" + basename.replace(".", "_")
94 macro = plainname.upper()
95
96 print task + " -> " + object
97
98 link.write("\t\t. = ALIGN(" + ("%d" % align) + ");\n")
99 link.write("\t\t*(." + plainname + "_image);\n\n")
100
101 header.write("extern int " + symbol + "_start;\n")
102 header.write("extern int " + symbol + "_end;\n\n")
103 header.write("#define " + macro + "_START ((void *) &" + symbol + "_start)\n")
104 header.write("#define " + macro + "_END ((void *) &" + symbol + "_end)\n")
105 header.write("#define " + macro + "_SIZE ((unsigned int) " + macro + "_END - (unsigned int) " + macro + "_START)\n\n")
106
107 data.write("\tcomponents[" + ("%d" % cnt) + "].name = \"" + plainname + "\";\n")
108 data.write("\tcomponents[" + ("%d" % cnt) + "].start = " + macro + "_START;\n")
109 data.write("\tcomponents[" + ("%d" % cnt) + "].end = " + macro + "_END;\n")
110 data.write("\tcomponents[" + ("%d" % cnt) + "].size = " + macro + "_SIZE;\n\n")
111
112 os.chdir(path)
113 subprocess.call([objcopy,
114 "-I", "binary",
115 "-O", format,
116 "-B", arch,
117 "--rename-section", ".data=." + plainname + "_image",
118 basename, os.path.join(workdir, object)])
119 os.chdir(workdir)
120
121 cnt = cnt + 1
122
123 link.write("\t}\n")
124 link.write("}\n")
125
126 header.write("#define COMPONENTS " + ("%d" % cnt) + "\n\n")
127 header.write("typedef struct {\n")
128 header.write("\tchar *name;\n\n")
129 header.write("\tvoid *start;\n")
130 header.write("\tvoid *end;\n")
131 header.write("\tunsigned int size;\n")
132 header.write("} component_t;\n\n")
133 header.write("extern void init_components(component_t *components);\n\n")
134 header.write("#endif\n")
135
136 data.write("}\n")
137
138 link.close()
139 header.close()
140 data.close()
141
142if __name__ == '__main__':
143 main()
Note: See TracBrowser for help on using the repository browser.