Как получить доступ / распечатать вспомогательную векторную запись в main? - PullRequest
4 голосов
/ 30 августа 2011

enter image description here

Согласно изображению, стек заполняется вспомогательной векторной записью при запуске.

Я не знаю об этом раньше.

Как я могу получить к ним доступ / распечатать?

int main(int argc, char *argv[], char *envp[]);

Означает ли это, что main имеет скрытый четвертый параметр?

Ответы [ 2 ]

3 голосов
/ 30 августа 2011

Вектор aux расположен сразу за концом вектора среды, который доступен (для POSIX) как extern char **environ;. environ указывает на массив с окончанием NULL-указателя char * указателей на переменные окружения. Итерируйте по среде, пока не достигнете NULL, затем продвиньтесь еще на один элемент и приведите результат к любому типу, который вы хотите использовать для доступа к вектору aux. Лично я рассматриваю это как массив значений size_t или uintptr_t, которые идут парами, поскольку это проще и более переносимо, чем типы elf.h Elf32_auxv_t и Elf64_auxv_t (для которых требуется особый случай создаете ли вы 32-битную или 64-битную цель).

Обратите внимание, что POSIX не определяет существование и местоположение вектора aux, но именно здесь они будут расположены в любой реализации на основе ELF-ABI, в которой используется вектор aux.

0 голосов
/ 30 августа 2011

Ответ на ваш вопрос зависит от системы.C ISO определяет только два аргумента функции main.Дополнительные аргументы не являются стандартными и должны рассматриваться как расширение.Цитирование Основная функция из Википедии:

Параметры argc, count аргумента и argv, вектор аргумента, [1] соответственно дают число и значение аргументов командной строки программы,Имена argc и argv могут быть любым допустимым идентификатором в C, но общепринято использовать эти имена.В C ++ имена должны восприниматься буквально, а «void» в списке параметров должен быть опущен, если требуется строгое соответствие.[2] Другие платформозависимые форматы также разрешены стандартами C и C ++, за исключением того, что в C ++ тип возвращаемого значения должен оставаться int;например, Unix (хотя не POSIX.1) и Microsoft Windows имеют третий аргумент, задающий среду программы, в противном случае доступ через getenv в stdlib.h:

int main(int argc, char **argv, char **envp)

Mac OS Xи Дарвин имеет четвертый параметр, содержащий произвольную информацию, предоставляемую ОС, например, путь к исполняемому двоичному файлу: [3]

int main(int argc, char **argv, char **envp, char **apple)

AMD64 ABI

В соответствии с System V ABI для AMD64, проект 0.99.5 , вспомогательные векторные записи имеют тип auxv_t, как показано ниже:

The AMD64 ABI uses the auxiliary vector types defined in figure 3.11.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...