]>
Commit | Line | Data |
---|---|---|
97b24d3d MV |
1 | # |
2 | # Copyright (C) 2012 Marek Vasut <[email protected]> | |
3 | # | |
4 | # See file CREDITS for list of people who contributed to this | |
5 | # project. | |
6 | # | |
7 | # This program is free software; you can redistribute it and/or | |
8 | # modify it under the terms of the GNU General Public License as | |
9 | # published by the Free Software Foundation; either version 2 of | |
10 | # the License, or (at your option) any later version. | |
11 | # | |
12 | ######################################################################### | |
13 | ||
14 | ## | |
15 | # make_u_boot_list - Generate contents of u_boot_list section | |
16 | # 1: The name of the resulting file (usually u-boot.lst) | |
17 | # 2: Files to analyze for possible u_boot_list entries | |
18 | # | |
19 | # This function generates the contents of the u_boot_list section, | |
20 | # including all the border symbols for it's subsections. The operation | |
21 | # of this function is as follows, numbering goes per lines: | |
22 | # | |
23 | # 1) Dump the ELF header sections from all files supplied via $(2) | |
24 | # 2) Filter out all other stuff that does not belong into .u_boot_list | |
25 | # section. | |
26 | # 3) Fix up the lines so that the resulting output is is in format | |
27 | # ".u_boot_list.*". | |
28 | # 4) Remove the last .something$, since that only contains the name | |
29 | # of the variable to be put into a subsection. This name is irelevant | |
30 | # for generation of border symbols, thus of no interest, remove it. | |
31 | # 5) Take each line and for every dot "." in that line, print the whole | |
32 | # line until that dot "." . This is important so that we have all | |
33 | # parent border symbols generated as well. | |
34 | # 6) Load every line and firstly append "\a" at the end and print the | |
35 | # line. Next, append "@" at the end and print the line. Finally, | |
36 | # append "~" at the end of line. This will make sense in conjunction | |
37 | # with 6) and 7). | |
38 | # 7) Sort the lines. It is imperative to use LC_COLLATE=C here because | |
39 | # with this, the "\a" symbol is first and "~" symbol is last. Any | |
40 | # other symbols fall inbetween. Symbols like "@", which marks the | |
41 | # end of current line (representing current section) and ".", which | |
42 | # means the line continues and thus represents subsection. | |
43 | # 8) With such ordering, all lines ending with "\a" will float at the | |
44 | # begining of all lines with the same prefix. Thus it is easy to | |
45 | # replace "\a" with __start and make it the __start border symbol. | |
46 | # Very similarly for "~", which will be always at the bottom and so | |
47 | # can be replaced by "__end" and made into the __end border symbol. | |
48 | # Finally, every line ending with "@" symbol will be transformed | |
49 | # into " *(SORT(${line}*)); " format, which in the linker parlance | |
50 | # will allow it to trap all symbols relevant to the subsection. | |
51 | # | |
52 | define make_u_boot_list | |
53 | $(1): $(2) | |
54 | $(OBJDUMP) -h $(2) | \ | |
55 | sed -n -e '/.*\.u_boot_list[^ ]\+/ ! {d;n}' \ | |
56 | -e 's/.*\(\.u_boot_list[^ ]\+\).*$$$$/\1/' \ | |
57 | -e 's/\.[^\.]\+$$$$//' \ | |
58 | -e ':s /^.\+$$$$/ { p;s/^\(.*\)\.[^\.]*$$$$/\1/;b s }' | \ | |
59 | sed -n -e 'h;s/$$$$/\a/p;g;s/$$$$/@/p;g;s/$$$$/~/p;' | \ | |
60 | LC_COLLATE=C sort -u | \ | |
61 | sed -n -e '/\a$$$$/ { s/\./_/g;s/\a$$$$/__start = .;/p; }'\ | |
62 | -e '/~$$$$/ { s/\./_/g;s/~$$$$/__end = .;/p; }'\ | |
63 | -e '/@$$$$/ { s/\(.*\)@$$$$/*(SORT(\1.*));/p }' > $(1) | |
64 | endef |