Subversion Repositories HelenOS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3023 decky 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
"""
30
Binary package creator
31
"""
32
 
33
import sys
34
import os
35
import subprocess
36
 
37
def usage(prname):
38
    "Print usage syntax"
39
    print prname + " <OBJCOPY> <FORMAT> <OUTPUT_FORMAT> <ARCH> <ALIGNMENT>"
40
 
41
def 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
 
142
if __name__ == '__main__':
143
    main()