annotate libgcc/vtv_start.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1 /* Copyright (C) 2012-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 This file is part of GCC.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
6 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
7 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
8 version.
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
13 for more details.
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 Under Section 7 of GPL version 3, you are granted additional
kono
parents:
diff changeset
16 permissions described in the GCC Runtime Library Exception, version
kono
parents:
diff changeset
17 3.1, as published by the Free Software Foundation.
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 You should have received a copy of the GNU General Public License and
kono
parents:
diff changeset
20 a copy of the GCC Runtime Library Exception along with this program;
kono
parents:
diff changeset
21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
kono
parents:
diff changeset
22 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 /* This file is part of the vtable verification feature (for a
kono
parents:
diff changeset
25 detailed description of the feature, see comments in
kono
parents:
diff changeset
26 vtable-verify.c). The vtable verification feature creates
kono
parents:
diff changeset
27 certain global symbols that need to be read-write sometimes during
kono
parents:
diff changeset
28 program execution, and read-only at others. It uses 'mprotect' to
kono
parents:
diff changeset
29 change the memory protections of the pages on which these variables
kono
parents:
diff changeset
30 are stored. In order to not affect the protections of other
kono
parents:
diff changeset
31 program variables, these variables are put into a special named
kono
parents:
diff changeset
32 section, ".vtable_map_vars", which is page-aligned at the start,
kono
parents:
diff changeset
33 and which is padded with a page-sized amount of zeros at the end.
kono
parents:
diff changeset
34 To make this section page aligned, we create a special symbol,
kono
parents:
diff changeset
35 "_vtable_map_vars_start" which we make the very first thing that
kono
parents:
diff changeset
36 goes into the section. This file defines that symbol (and only
kono
parents:
diff changeset
37 that symbol). GCC compiles this file into vtv_start.o, and
kono
parents:
diff changeset
38 inserts vtv_start.o into the link line immediately after
kono
parents:
diff changeset
39 crtbegin.o, if the program is compiled with -fvtable.verify.
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 In order to pad the ".vtable_map_vars" section with a page-sized
kono
parents:
diff changeset
42 amount of zeros at the end, there is a second symbol,
kono
parents:
diff changeset
43 _vtable_map_vars_end, which is defined in another file, vtv_end.c.
kono
parents:
diff changeset
44 This second symbol is a page-sized array of chars, zero-filled, and
kono
parents:
diff changeset
45 is the very last thing to go into the section. When the GCC driver
kono
parents:
diff changeset
46 inserts vtv_start.o into the link line (just after crtbegin.o) it
kono
parents:
diff changeset
47 also inserts vtv_end.o into the link line, just before crtend.o.
kono
parents:
diff changeset
48 This has the desired effect of making our section page-aligned and
kono
parents:
diff changeset
49 page-size paded, ensuring that no other program data lands on our
kono
parents:
diff changeset
50 pages. */
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 #include "vtv-change-permission.h"
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 __attribute__ ((constructor(98))) void
kono
parents:
diff changeset
55 __VLTunprotect (void)
kono
parents:
diff changeset
56 {
kono
parents:
diff changeset
57 __VLTChangePermission (__VLTP_READ_WRITE);
kono
parents:
diff changeset
58 }
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 /* Page-aligned symbol to mark beginning of .vtable_map_vars section. */
kono
parents:
diff changeset
61 char _vtable_map_vars_start []
kono
parents:
diff changeset
62 __attribute__ ((__visibility__ ("protected"), used, aligned(VTV_PAGE_SIZE),
kono
parents:
diff changeset
63 section(".vtable_map_vars")))
kono
parents:
diff changeset
64 = { };