• Home
Name Date Size #Lines LOC

..--

arch-arm/asm/03-May-2024-6,1893,488

arch-mips/asm/03-May-2024-18,84212,715

arch-x86/asm/03-May-2024-8,3354,296

common/03-May-2024-61,89141,181

tools/03-May-2024-3,4552,500

README.TXTD03-May-202410.2 KiB271186

README.TXT

1Bionic comes with a set of 'clean' Linux kernel headers that can safely be
2included by userland applications and libraries without fear of hideous
3conflicts. for more information why this is needed, see the "RATIONALE"
4section at the end of this document.
5
6these clean headers are automatically generated by several scripts located
7in the 'bionic/kernel/tools' directory, which process a set of original
8and unmodified kernel headers in order to get rid of many annoying
9declarations and constructs that usually result in compilation failure.
10
11the 'clean headers' only contain type and macro definitions, with the
12exception of a couple static inline functions used for performance
13reason (e.g. optimized CPU-specific byte-swapping routines)
14
15they can be included from C++, or when compiling code in strict ANSI mode.
16they can be also included before or after any Bionic C library header.
17
18the generation process works as follows:
19
20  * 'external/kernel-headers/original/'
21    contains a set of kernel headers as normally found in the 'include'
22    directory of a normal Linux kernel source tree. note that this should
23    only contain the files that are really needed by Android (use
24    'find_headers.py' to find these automatically).
25
26  * 'bionic/libc/kernel/common'
27    contains the non-arch-specific clean headers and directories
28    (e.g. linux, asm-generic and mtd)
29
30  * 'bionic/libc/kernel/arch-arm/'
31    contains the ARM-specific directory tree of clean headers.
32
33  * 'bionic/libc/kernel/arch-arm/asm'
34    contains the real ARM-specific headers
35
36  * 'bionic/libc/kernel/arch-x86'
37    'bionic/libc/kernel/arch-x86/asm'
38    similarly contains all headers and symlinks to be used on x86
39
40  * 'bionic/libc/kernel/tools' contains various Python and shell scripts used
41    to manage and re-generate the headers
42
43the tools you can use are:
44
45  * tools/find_users.py
46    scans a list of source files or directories and prints which ones do
47    include Linux headers.
48
49  * tools/find_headers.py
50    scans a list of source files or directories and recursively finds all
51    the original kernel headers they need.
52
53  * tools/clean_header.py
54    prints the clean version of a given kernel header. with the -u option,
55    this will also update the corresponding clean header file if its
56    content has changed. you can also process more than one file with -u
57
58  * tools/update_all.py
59    automatically update all clean headers from the content of
60    'external/kernel-headers/original'. this is the script you're likely going to
61    run whenever you update the original headers.
62
63
64HOW TO BUILD BIONIC AND OTHER PROGRAMS WITH THE CLEAN HEADERS:
65==============================================================
66
67add bionic/kernel/common and bionic/kernel/arch-<yourarch> to your C
68include path. that should be enough. Note that Bionic will not compile properly
69if you don't.
70
71
72HOW TO SUPPORT ANOTHER ARCHITECTURE:
73====================================
74
75see the content of tools/defaults.py, you will need to make a few updates
76here:
77
78  - add a new item to the 'kernel_archs' list of supported architectures
79
80  - add a proper definition for 'kernel_known_<arch>_statics' with
81    relevant definitions.
82
83  - update 'kernel_known_statics' to map "<arch>" to
84    'kernel_known_<arch>_statics'
85
86then, add the new architecture-specific headers to original/asm-<arch>.
87(please ensure that these are really needed, e.g. with tools/find_headers.py)
88
89finally, run tools/update_all.py
90
91
92
93HOW TO UPDATE THE HEADERS WHEN NEEDED:
94======================================
95
96IMPORTANT IMPORTANT:
97
98  WHEN UPDATING THE HEADERS, ALWAYS CHECK THAT THE NEW CLEAN HEADERS DO
99  NOT BREAK THE KERNEL <-> USER ABI, FOR EXAMPLE BY CHANGING THE SIZE
100  OF A GIVEN TYPE. THIS TASK CANNOT BE EASILY AUTOMATED AT THE MOMENT
101
102copy any updated kernel header into the corresponding location under
103'bionic/kernel/original'.
104
105for any new kernel header you want to add, first run tools/find_headers.py to be
106sure that it is really needed by the Android sources. then add it to
107'bionic/kernel/original'
108
109then, run tools/update_all.py to re-run the auto-cleaning
110
111
112
113HOW THE CLEANUP PROCESS WORKS:
114==============================
115
116this section describes the action performed by the cleanup program(s) when they
117process the original kernel headers into clean ones:
118
1191. Optimize well-known macros (e.g. __KERNEL__, __KERNEL_STRICT_NAMES)
120
121    this pass gets rid of everything that is guarded by a well-known macro
122    definition. this means that a block like
123
124       #ifdef __KERNEL__
125       ....
126       #endif
127
128    will be totally omitted from the output. the optimizer is smart enough to
129    handle all complex C-preprocessor conditional expression appropriately.
130    this means that, for example:
131
132       #if defined(__KERNEL__) || defined(FOO)
133       ...
134       #endif
135
136    will be transformed into:
137
138       #ifdef FOO
139       ...
140       #endif
141
142    see tools/defaults.py for the list of well-known macros used in this pass,
143    in case you need to update it in the future.
144
145    note that this also remove any reference to a kernel-specific configuration
146    macro like CONFIG_FOO from the clean headers.
147
148
1492. remove variable and function declarations:
150
151  this pass scans non-directive text and only keeps things that look like a
152  typedef/struct/union/enum declaration. this allows to get rid of any variable
153  or function declaration that should only be used within the kernel anyway
154  (and which normally *should* be guarded in a #ifdef __KERNEL__ ... #endif
155  block, if the kernel writers were not so messy)
156
157  there are however a few exceptions: it is seldom useful to keep the definition
158  of some static inline functions performing very simple operations. a good
159  example is the optimized 32-bit byte-swap function found in
160  arch-arm/asm/byteorder.h
161
162  the list of exceptions is in tools/defaults.py in case you need to update it
163  in the future.
164
165  note that we do *not* remove macro definitions, including these macro that
166  perform a call to one of these kernel-header functions, or even define other
167  functions. we consider it safe since userland applications have no business
168  using them anyway.
169
170
1713. whitespace cleanup:
172
173  the final pass remove any comments and empty lines from the final headers.
174
175
1764. add a standard disclaimer:
177
178  prepended to each generated header, contains a message like
179  "do not edit directly - file was auto-generated by ...."
180
181
182RATIONALE:
183==========
184
185OVERVIEW OF THE CURRENT KERNEL HEADER MESS:
186-------------------------------------------
187
188The original kernel headers are not easily usable from userland applications.
189they contain many declarations and construct that will result in a compilation
190failure or even worse, incorrect behaviour. for example:
191
192- some headers try to define Posix types (e.g. size_t, ssize_t) that can
193  conflict with the corresponding definitions provided by your C library.
194
195- some headers use constructs that cannot be compiled in ANSI C mode.
196
197- some headers use constructs do not compile with C++ at all.
198
199- some headers contain invalid "legacy" definitions for the benefit of old
200  C libraries (e.g. glibc5) but result in incorrect behaviour if used
201  directly.
202
203  e.g. gid_t being defined in <linux/types.h> as a 16-bit type while the
204  kernel uses 32-bit ids. this results in problems when getgroups() or
205  setgroups() are called, since they operate on gid_t arrays.
206
207unfortunately, these headers are also the only source of some really extensive
208constant and type definitions that are required by userland applications.
209think any library/program that need to access ALSA, or Video4Linux, or
210anything related to a specific device or Linux-specific system interface
211(e.g. IOCTLS, etc...)
212
213As a consequence, every Linux distribution provides a set of patched kernel
214headers to be used by userland applications (which installs in
215/usr/include/linux/, /usr/include/asm/, etc...). these are manually maintained
216by distribution packagers, and generated either manually or with various
217scripts. these headers are also tailored to GNU LibC and cannot be reused
218easily by Bionic.
219
220for a really long period, the kernel authors have stated that they don't want
221to fix the problem, even when someone proposed a patch to start cleaning the
222official headers. from their point of view this is purely a library author
223problem.
224
225fortunately, enlightnment happened, and the kernel now provides a way to
226install a set of "user-friendly" headers that are generated from the official
227ones by stripping the __KERNEL__ protected declarations.
228
229unfortunately, this is not enough for Bionic because the result still contains
230a few broken declarations that are difficult to route around. (see below for
231a little bit of details).
232
233we plan to be able to support these kernel-generated user-land headers in the
234future, but the priority on this issue is very low.
235
236
237WHAT WE DO:
238-----------
239
240so we're doomed to repeat the same effort than anyone else. the big difference
241here is that we want to automate as much as possible the generation of the
242clean headers to easily support additional architectures in the future,
243and keep current with upstream changes in the header definitions with the
244least possible hassle.
245
246of course, this is only a race to the bottom. the kernel maintainers still
247feel free to randomly break the structure of their headers (e.g. moving the
248location of some files) occasionally, so we'll need to keep up with that by
249updating our build script/original headers as these cases happen.
250
251what we do is keep a set of "original" kernel headers, and process them
252automatically to generate a set of "clean" headers that can be used from
253userland and the C library.
254
255note that the "original" headers can be tweaked a little to avoid some subtle
256issues. for example:
257
258- when the location of various USB-related headers changes in the kernel
259  source tree, we want to keep them at the same location in our generated
260  headers (there is no reason to break the userland API for something
261  like that).
262
263- sometimes, we prefer to take certain things out of blocks guarded by a
264  #ifdef __KERNEL__ .. #endif. for example, on recent kernels <linux/wireless.h>
265  only includes <linux/if.h> when in kernel mode. we make it available to
266  userland as well since some code out there assumes that this is the case.
267
268- sometimes, the header is simply incorrect (e.g. it uses a type without
269  including the header that defines it before-hand)
270
271