1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
Shared Library Reduction Tool
-----------------------------
The motivation for this tool was the understanding that the ACE & TAO
libraries were to be linked with the VxWorks kernel to allow multiple
applications to be run simultaniously with a minimum of footprint
consumed. Ordinarily a choice is made between static linking
applications, where each application gets only the object modules
needed, and shared object linkage, where multiple applications share
access to full libraries. Frequently a shared library will contain
code and data which is not used by any of the applications in a
particular configuration. The Shared Library Reduction Tool builds
libraries that include only the modules needed to support a specified
set of applications.
The analysis is performed very late in the application implementation,
allowing the system implementors the freedom to use whatever TAO & ACE
components are needed. Once an application is built and running, its
shared object need may be evaluated. The evaluation is straight
forward. Run the soreduce program, passing the path to all of the
applications that will share the libraries. The soreduce program uses
the following steps to generate its results.
1. A list of undefined symbols and shared libraries is built by
invoking the ldd and nm commands on each application. For now,
soreduce assumes the GNU variant of these tools.
2. For each shared library, soreduce tries to invoke nm on each of the
intermediate object files used to build the library. It is
important that target library directory has a current .shobj
subdirectory.
3. The list of undefined symbols is traversed. For each entry in the list, the
modules loaded from step 2 are examined to look for a matching
symbol. When one is found, the target symbol, and any others
satisfied by the module are removed from the list, and any
undefined symbols in the module are added to the list. This
process is repeated until the entire list of undefined symbols is
traversed without change.
4. MPC files are generated. Rather than invoking the linker directly, an mpc
file is generated that may be used to build the libs. With these
mpc files, the actual library will be named (orig)_subset.
Analysis Artifacts
------------------
Development of the shared library reduction tool also provided a
secondary benefit. It is able to output usage metrics for the various
modules, which may be useful for directing further hand-crafted
reduction efforts. Using the GNU nm with more verbose output, it is
possible to determine the first function using a given undefined
symbol. While it is not (yet) possible to automate the refactoring of
code based on this analysis, this information can provide a road map
for breaking a single module into two or a few that will result in
fewer incidental dependancies overall. However this speculation has
not been tested.
Test results
------------
Running soreduce providing itself as the sole client. The soreduce
application is built on top of ACE, using just a few of ACE's
features. Here is the output:
bash$ ./soreduce soreduce
discovering libraries
loading object modules
Libs subject to analysis:
ACE
Starting analysis
pass 0, undef count = 69
pass 1, undef count = 207
pass 2, undef count = 278
pass 3, undef count = 271
pass 4, undef count = 245
pass 5, undef count = 235
Writing results
Making directory /opt/wustl/ACE_wrappers/build/native/ace/usage_metrics
ACE: 61 out of 210 modules required
writing file /opt/wustl/ACE_wrappers/build/native/ace/ACE_subset.mpc
Done.
The size of libACE.so before rebuilding:
bash$ size libACE.so
text data bss dec hex filename
2361958 498760 12516 2873234 2bd792 libACE.so
and after:
bash$ size libACE_subset.so
text data bss dec hex filename
987167 207452 7580 1202199 125817 libACE_subset.so
2873234 - 1202199 = 1671035 bytes eliminated, a 58.2% reduction
Here is another example, using the Naming Service, and its simple test
client. Note that the orbsvcs results are bogus, the libraries are
already fairly well factored so that the additional subsetting by
soreduce is not effective. Also, due to the layout of the orbsvcs
library source directory, the tool may not generate valid mpc files.
bash$ $ACE_ROOT/apps/soreduce/soreduce Naming_Service/Naming_Service tests/Simple_Naming/client
discovering libraries
loading object modules
Libs subject to analysis:
TAO_CosNaming
TAO_Svc_Utils
TAO_IORTable
TAO_PortableServer
TAO
ACE
Starting analysis
pass 0, undef count = 339
pass 1, undef count = 580
pass 2, undef count = 438
pass 3, undef count = 278
pass 4, undef count = 244
pass 5, undef count = 246
pass 6, undef count = 242
Writing results
Making directory /opt/wustl/ACE_wrappers/build/native/TAO/orbsvcs/orbsvcs/usage_metrics
TAO_CosNaming: 11 out of 256 modules required
writing file /opt/wustl/ACE_wrappers/build/native/TAO/orbsvcs/orbsvcs/TAO_CosNaming_subset.mpc
Making directory /opt/wustl/ACE_wrappers/build/native/TAO/orbsvcs/orbsvcs/usage_metrics
TAO_Svc_Utils: 8 out of 256 modules required
writing file /opt/wustl/ACE_wrappers/build/native/TAO/orbsvcs/orbsvcs/TAO_Svc_Utils_subset.mpc
Making directory /opt/wustl/ACE_wrappers/build/native/TAO/tao/IORTable/usage_metrics
TAO_IORTable: 4 out of 4 modules required
writing file /opt/wustl/ACE_wrappers/build/native/TAO/tao/IORTable/TAO_IORTable_subset.mpc
Making directory /opt/wustl/ACE_wrappers/build/native/TAO/tao/PortableServer/usage_metrics
TAO_PortableServer: 26 out of 29 modules required
writing file /opt/wustl/ACE_wrappers/build/native/TAO/tao/PortableServer/TAO_PortableServer_subset.mpc
Making directory /opt/wustl/ACE_wrappers/build/native/TAO/tao/usage_metrics
TAO: 160 out of 191 modules required
writing file /opt/wustl/ACE_wrappers/build/native/TAO/tao/TAO_subset.mpc
Making directory /opt/wustl/ACE_wrappers/build/native/ace/usage_metrics
ACE: 75 out of 210 modules required
writing file /opt/wustl/ACE_wrappers/build/native/ace/ACE_subset.mpc
Done.
Size before & after:
text data bss dec hex filename
2361958 498760 12516 2873234 2bd792 libACE.so
3432206 704188 30992 4167386 3f96da libTAO.so
1931145 326632 7528 2265305 2290d9 libTAO_PortableServer.so
76561 12504 364 89429 15d55 libTAO_IORTable.so
Sum: 9395354
text data bss dec hex filename
1340017 275440 8140 1623597 18c62d libACE_subset.so
3131226 643816 27984 3803026 3a0792 libTAO_subset.so
1845515 308812 6896 2161223 20fa47 libTAO_PortableServer_subset.so
76603 12508 364 89475 15d83 libTAO_IORTable_subset.so
Sum: 7677321
Savings: 1718033 or 18.3%
|