diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-09-21 21:57:11 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-09-21 21:57:11 +0000 |
commit | 357ed048debba31da3ee1c0a24a3915fbe2d6a43 (patch) | |
tree | 14cfbb9d58780e8b97fa7ed642ea8b7dc1233c6c /libcap/execable.h | |
parent | e61c65778b22599546e46eee12f857dd1c28f89e (diff) | |
parent | d7d1a0a38c5be06a7e7d6391d140b54878836f48 (diff) | |
download | libcap-357ed048debba31da3ee1c0a24a3915fbe2d6a43.tar.gz |
Snap for 10843824 from d7d1a0a38c5be06a7e7d6391d140b54878836f48 to 24Q1-releaseandroid-14.0.0_r37android-14.0.0_r36android-14.0.0_r35android-14.0.0_r34android-14.0.0_r33android-14.0.0_r32android-14.0.0_r31android-14.0.0_r30android-14.0.0_r29android14-qpr2-s5-releaseandroid14-qpr2-s4-releaseandroid14-qpr2-s3-releaseandroid14-qpr2-s2-releaseandroid14-qpr2-s1-releaseandroid14-qpr2-release
Change-Id: I9c49381008e4ea940690b36fd9cde1c2078adc75
Diffstat (limited to 'libcap/execable.h')
-rw-r--r-- | libcap/execable.h | 49 |
1 files changed, 34 insertions, 15 deletions
diff --git a/libcap/execable.h b/libcap/execable.h index 0bcc5d4..7a2d247 100644 --- a/libcap/execable.h +++ b/libcap/execable.h @@ -71,23 +71,42 @@ static void __execable_parse_args(int *argc_p, char ***argv_p) } /* + * Linux x86 ABI requires the stack be 16 byte aligned. Keep things + * simple and just force it. + */ +#if defined(__i386__) || defined(__x86_64__) +#define __SO_FORCE_ARG_ALIGNMENT __attribute__((force_align_arg_pointer)) +#else +#define __SO_FORCE_ARG_ALIGNMENT +#endif /* def some x86 */ + +/* + * Permit the compiler to override this one. + */ +#ifndef EXECABLE_INITIALIZE +#define EXECABLE_INITIALIZE do { } while(0) +#endif /* ndef EXECABLE_INITIALIZE */ + +/* * Note, to avoid any runtime confusion, SO_MAIN is a void static * function. */ - -#define SO_MAIN \ -static void __execable_main(int, char**); \ -extern void __so_start(void); \ -void __so_start(void) \ -{ \ - int argc; \ - char **argv; \ - __execable_parse_args(&argc, &argv); \ +#define SO_MAIN \ +static void __execable_main(int, char**); \ +__attribute__((visibility ("hidden"))) \ +void __so_start(void); \ +__SO_FORCE_ARG_ALIGNMENT \ +void __so_start(void) \ +{ \ + int argc; \ + char **argv; \ + __execable_parse_args(&argc, &argv); \ + EXECABLE_INITIALIZE; \ __execable_main(argc, argv); \ - if (argc != 0) { \ - free(argv[0]); \ - free(argv); \ - } \ - exit(0); \ -} \ + if (argc != 0) { \ + free(argv[0]); \ + free(argv); \ + } \ + exit(0); \ +} \ static void __execable_main |