2014-06-10 1 views

답변

3

libc은 특정 OS, 프로세서 및 자주 사용되는 컴파일러에 깊이 관련되어있는 라이브러리입니다. 따라서 libc 소식통에 상당히 신비한 내용을 보는 것은 드문 일이 아닙니다. 이 경우

ubp_avargv바운드 포인터이다. GCC는 포인터에 대한 특정 바운드 검사 작업을 제어하는 ​​(잘 설명되지 않은) __bounded__unbounded 유형 주석을 제공합니다. 아마도 argv이 OS에 의해 제공 되었기 때문에 무한대로 간주되고 (즉, 본질적으로 임의의 길이의 메모리를 가리킬 수 있음) 아마도 코드 표시 기준 libc으로 표시해야 할 것입니다.

다음은 GNU C 라이브러리의 특정 버전에서 약간 다른 함수 서명 : 당신이 ubp_av이 "argv를 위해 무제한의 포인터"를 의미하는 것이 분명히 알 수있는

int 
/* GKM FIXME: GCC: this should get __BP_ prefix by virtue of the 
    BPs in the arglist of startup_info.main and startup_info.init. */ 
    BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, 
        char *__unbounded *__unbounded ubp_ev, 
        ElfW (auxv_t) * __unbounded auxvec, 
        void (*rtld_fini) (void), 
        struct startup_info *__unbounded stinfo, 
        char *__unbounded *__unbounded stack_on_entry) 
{ 
#if __BOUNDED_POINTERS__ 
    char **argv; 
#else 
# define argv ubp_av 
#endif 

... 

.

+0

Thee 링크는 더 나은 당신의 대답을 이해하고 다른 사람들을 돕기 위해 추가합니다 : [link] (http://en.wikipedia.org/wiki/Bounded_pointer), [link] (https://gcc.gnu.org/projects/bp/main.html)), [link] (https://www.sourceware.org/ml/glibc-linux/2000-q2/msg00145.html) 그 gcc 프로젝트는 포기 된 것 같습니다. – user2431763

0

편집 :nneonneo's answer이 내 것보다 좋습니다.

argvmain의 두 번째 인수이며, 유형은 char**입니다.

이 함수 __libc_start_main에는 7 개의 매개 변수가 있습니다. 첫 번째 포인터는 main과 호환되는 것으로 보이는 함수에 대한 포인터입니다.이 포인터는 환경 포인터 일 가능성이 있습니다. 이 함수 포인터의 선언은 가리키는 함수의 매개 변수 이름을 생략합니다. 했던 그 이름이 포함 된 경우, 첫 번째 줄 수 있었다 :

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

은 다른 6 개 매개 변수 선언 하였다.

이름을 부여하면 __libc_start_main은 아마도 사용자 라이브러리의 main 함수를 호출하는 런타임 라이브러리의 함수 일 것입니다.

두 번째 인수는 int argc이지만 main의 첫 번째 인수와 구별됩니다. 자세한 내용은없이

(특히 어떤이에서 인 C 라이브러리의 구현), 모든 나는 약 upb_av 그것은, __libc_start_main의 세 번째 매개 변수라는 것이다 그것은 유형 char**의 있다고 말할 수 있습니다. av 접미사는 이것이 어떤 종류의 인수 벡터임을 나타냅니다. 그러나 접두사가 무엇을 의미하는지 모르겠습니다. argv과 관련이있을 수 있지만 별개의 문제입니다.

+0

main()의 세 번째 매개 변수는 envp이며 선언에 없더라도 항상 main()에 스택으로 전달됩니다. int main (int argc, char ** argv) { ...} – user2431763

+1

@ user2431763 : 어떤 상황에서?'envp '는 일반적인 확장이지만 C 표준은 언급하지 않습니다. –

+0

네가 맞다. Debian wheezy (32 비트)에서 gc 4.7.2로 시도했다. – user2431763

관련 문제