Marek Vasut | a0603a3 | 2012-10-19 05:00:10 +0000 | [diff] [blame] | 1 | # |
| 2 | # Copyright (C) 2012 Marek Vasut <marex@denx.de> |
| 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 |