Я не знаю, как это сделать на MacOS, но я подозреваю, что трюк, который я опишу здесь, можно перенести на MacOS с небольшим количеством перекрестного чтения.
В linux вы можете использовать так называемый раздел .init_array двоичного файла ELF, чтобы зарегистрировать функцию, которая вызывается во время инициализации программы (до вызова main ()). Эта функция имеет ту же сигнатуру, что и обычная функция main (), за исключением того, что она возвращает «void».
Таким образом, вы можете использовать эту функцию для запоминания или обработки argc, argv [] и evp [].
Вот код, который вы можете использовать:
static void my_cool_main(int argc, char* argv[], char* envp[])
{
// your code goes here
}
__attribute__((section(".init_array"))) void (* p_my_cool_main)(int,char*[],char*[]) = &my_cool_main;
PS: Этот код также можно поместить в библиотеку, поэтому он должен соответствовать вашему случаю.
Это даже работает, когда ваша prgram запускается с valgrind - valgrind не запускает новый процесс, и в результате / proc / self / cmdline показывает исходную командную строку valgrind.
PPS: имейте в виду, что во время этого очень раннего выполнения программы многие подсистемы еще не полностью инициализированы - я попробовал подпрограммы ввода / вывода libc, они, кажется, работают, но не полагаются на это - даже глобальные переменные могут еще не быть построенным и т.д ...