diff options
author | Matthew Maurer <mmaurer@google.com> | 2020-10-23 09:55:33 -0700 |
---|---|---|
committer | Ryan Prichard <rprichard@google.com> | 2020-11-02 17:28:41 -0800 |
commit | de30635eb67282b37454dc0d3f67507feb172967 (patch) | |
tree | 8c9d46b1b7c0c245c33efb14ed919dfec88baae8 /libc/malloc_hooks/malloc_hooks.cpp | |
parent | 10c2875934c9f47b39c1ffd9a3ecbe63d59f3183 (diff) |
Put __*_ARRAY__ symbols before prioritized init/fini funcs
A constructor or destructor function with an integral priority is
placed in an .init_array or .fini_array section with the priority
suffixed to the section name:
- __attribute__((constructor)) ==> .init_array
- __attribute__((constructor(42))) ==> .init_array.42
The suffixed init/fini sections appear before the unsuffixed sections,
so the prioritized functions appeared before the __{INIT,FINI}_ARRAY__
symbols and were dropped when the symbols were used.
The (static) linker doesn't recognize priority suffixes on
.preinit_array.
This bug affected .init_array and .fini_array for static executables.
For dynamic executables, only .fini_array was affected, because
.init_array is handled by the dynamic loader instead, which uses
DT_INIT_ARRAY[SZ]. For DSOs, neither is affected, because the two
sections are only handled by the dynamic loader.
This patch also fixes a minor inconsistency where dynamic init/preinit
were passed argc/argv/envp, but static were not.
Bug: http://b/170983066
Test: bionic-unit-tests
Change-Id: I0fffa776e5d9bdb6f8af06b4c1af148236742fef
Diffstat (limited to 'libc/malloc_hooks/malloc_hooks.cpp')
0 files changed, 0 insertions, 0 deletions