亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? init-first.c

?? glibc2.5版源代碼
?? C
字號:
/* Initialization code run first thing by the ELF startup code.  For i386/Hurd.   Copyright (C) 1995,96,97,98,99,2000,01,02,03,04,05	Free Software Foundation, Inc.   This file is part of the GNU C Library.   The GNU C Library is free software; you can redistribute it and/or   modify it under the terms of the GNU Lesser General Public   License as published by the Free Software Foundation; either   version 2.1 of the License, or (at your option) any later version.   The GNU C Library is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   Lesser General Public License for more details.   You should have received a copy of the GNU Lesser General Public   License along with the GNU C Library; if not, write to the Free   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA   02111-1307 USA.  */#include <assert.h>#include <hurd.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <sysdep.h>#include <set-hooks.h>#include "hurdstartup.h"#include "hurdmalloc.h"		/* XXX */#include "../locale/localeinfo.h"#include <ldsodefs.h>#include <fpu_control.h>extern void __mach_init (void);extern void __init_misc (int, char **, char **);#ifdef USE_NONOPTION_FLAGSextern void __getopt_clean_environment (char **);#endif#ifndef SHAREDextern void _dl_non_dynamic_init (void) internal_function;#endifextern void __libc_global_ctors (void);unsigned int __hurd_threadvar_max;unsigned long int __hurd_threadvar_stack_offset;unsigned long int __hurd_threadvar_stack_mask;#ifndef SHAREDint __libc_enable_secure;#endifint __libc_multiple_libcs attribute_hidden = 1;extern int __libc_argc attribute_hidden;extern char **__libc_argv attribute_hidden;extern char **_dl_argv;extern void *(*_cthread_init_routine) (void) __attribute__ ((weak));void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));/* Things that want to be run before _hurd_init or much anything else.   Importantly, these are called before anything tries to use malloc.  */DEFINE_HOOK (_hurd_preinit_hook, (void));/* We call this once the Hurd magic is all set up and we are ready to be a   Posixoid program.  This does the same things the generic version does.  */static voidposixland_init (int argc, char **argv, char **envp){  __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up;  /* Make sure we don't initialize twice.  */  if (!__libc_multiple_libcs)    {      /* Set the FPU control word to the proper default value.  */      __setfpucw (__fpu_control);    }  /* Save the command-line arguments.  */  __libc_argc = argc;  __libc_argv = argv;  __environ = envp;#ifndef SHARED  _dl_non_dynamic_init ();#endif  __init_misc (argc, argv, envp);#ifdef USE_NONOPTION_FLAGS  /* This is a hack to make the special getopt in GNU libc working.  */  __getopt_clean_environment (envp);#endif#ifdef SHARED  __libc_global_ctors ();#endif}static voidinit1 (int argc, char *arg0, ...){  char **argv = &arg0;  char **envp = &argv[argc + 1];  struct hurd_startup_data *d;#ifndef SHARED  extern ElfW(Phdr) *_dl_phdr;  extern size_t _dl_phnum;#endif  while (*envp)    ++envp;  d = (void *) ++envp;  /* If we are the bootstrap task started by the kernel,     then after the environment pointers there is no Hurd     data block; the argument strings start there.  */  if ((void *) d == argv[0])    {#ifndef SHARED      /* We may need to see our own phdrs, e.g. for TLS setup.         Try the usual kludge to find the headers without help from	 the exec server.  */      extern const void _start;      const ElfW(Ehdr) *const ehdr = &_start;      _dl_phdr = (ElfW(Phdr) *) ((const void *) ehdr + ehdr->e_phoff);      _dl_phnum = ehdr->e_phnum;      assert (ehdr->e_phentsize == sizeof (ElfW(Phdr)));#endif      return;    }#ifndef SHARED  __libc_enable_secure = d->flags & EXEC_SECURE;  _dl_phdr = (ElfW(Phdr) *) d->phdr;  _dl_phnum = d->phdrsz / sizeof (ElfW(Phdr));  assert (d->phdrsz % sizeof (ElfW(Phdr)) == 0);#endif  _hurd_init_dtable = d->dtable;  _hurd_init_dtablesize = d->dtablesize;  {    /* Check if the stack we are now on is different from       the one described by _hurd_stack_{base,size}.  */    char dummy;    const vm_address_t newsp = (vm_address_t) &dummy;    if (d->stack_size != 0 && (newsp < d->stack_base ||			       newsp - d->stack_base > d->stack_size))      /* The new stack pointer does not intersect with the	 stack the exec server set up for us, so free that stack.  */      __vm_deallocate (__mach_task_self (), d->stack_base, d->stack_size);  }  if (d->portarray || d->intarray)    /* Initialize library data structures, start signal processing, etc.  */    _hurd_init (d->flags, argv,		d->portarray, d->portarraysize,		d->intarray, d->intarraysize);}static inline voidinit (int *data){  int argc = *data;  char **argv = (void *) (data + 1);  char **envp = &argv[argc + 1];  struct hurd_startup_data *d;  unsigned long int threadvars[_HURD_THREADVAR_MAX];  /* Provide temporary storage for thread-specific variables on the     startup stack so the cthreads initialization code can use them     for malloc et al, or so we can use malloc below for the real     threadvars array.  */  memset (threadvars, 0, sizeof threadvars);  threadvars[_HURD_THREADVAR_LOCALE] = (unsigned long int) &_nl_global_locale;  __hurd_threadvar_stack_offset = (unsigned long int) threadvars;  /* Since the cthreads initialization code uses malloc, and the     malloc initialization code needs to get at the environment, make     sure we can find it.  We'll need to do this again later on since     switching stacks changes the location where the environment is     stored.  */  __environ = envp;  while (*envp)    ++envp;  d = (void *) ++envp;  /* The user might have defined a value for this, to get more variables.     Otherwise it will be zero on startup.  We must make sure it is set     properly before before cthreads initialization, so cthreads can know     how much space to leave for thread variables.  */  if (__hurd_threadvar_max < _HURD_THREADVAR_MAX)    __hurd_threadvar_max = _HURD_THREADVAR_MAX;  /* After possibly switching stacks, call `init1' (above) with the user     code as the return address, and the argument data immediately above     that on the stack.  */  if (&_cthread_init_routine && _cthread_init_routine)    {      /* Initialize cthreads, which will allocate us a new stack to run on.  */      int *newsp = (*_cthread_init_routine) ();      struct hurd_startup_data *od;      void switch_stacks (void);      /* Copy per-thread variables from that temporary	 area onto the new cthread stack.  */      memcpy (__hurd_threadvar_location_from_sp (0, newsp),	      threadvars, sizeof threadvars);      /* Copy the argdata from the old stack to the new one.  */      newsp = memcpy (newsp - ((char *) &d[1] - (char *) data), data,		      (char *) d - (char *) data);#ifdef SHARED      /* And readjust the dynamic linker's idea of where the argument         vector lives.  */      assert (_dl_argv == argv);      _dl_argv = (void *) (newsp + 1);#endif      /* Set up the Hurd startup data block immediately following	 the argument and environment pointers on the new stack.  */      od = ((void *) newsp + ((char *) d - (char *) data));      if ((void *) argv[0] == d)	/* We were started up by the kernel with arguments on the stack.	   There is no Hurd startup data, so zero the block.  */	memset (od, 0, sizeof *od);      else	/* Copy the Hurd startup data block to the new stack.  */	*od = *d;      /* Push the user code address on the top of the new stack.  It will	 be the return address for `init1'; we will jump there with NEWSP	 as the stack pointer.  */      *--newsp = data[-1];      ((void **) data)[-1] = switch_stacks;      /* Force NEWSP into %ecx and &init1 into %eax, which are not restored	 by function return.  */      asm volatile ("# a %0 c %1" : : "a" (newsp), "c" (&init1));    }  else    {      /* We are not using cthreads, so we will have just a single allocated	 area for the per-thread variables of the main user thread.  */      unsigned long int *array;      unsigned int i;      int usercode;      void call_init1 (void);      array = malloc (__hurd_threadvar_max * sizeof (unsigned long int));      if (array == NULL)	__libc_fatal ("Can't allocate single-threaded thread variables.");      /* Copy per-thread variables from the temporary array into the	 newly malloc'd space.  */      memcpy (array, threadvars, sizeof threadvars);      __hurd_threadvar_stack_offset = (unsigned long int) array;      for (i = _HURD_THREADVAR_MAX; i < __hurd_threadvar_max; ++i)	array[i] = 0;      /* The argument data is just above the stack frame we will unwind by	 returning.  Mutate our own return address to run the code below.  */      usercode = data[-1];      data[-1] = (int) &call_init1;      /* Force USERCODE into %eax and &init1 into %ecx, which are not	 restored by function return.  */      asm volatile ("# a %0 c %1" : : "a" (usercode), "c" (&init1));    }}/* These bits of inline assembler used to be located inside `init'.   However they were optimized away by gcc 2.95.  *//* The return address of `init' above, was redirected to here, so at   this point our stack is unwound and callers' registers restored.   Only %ecx and %eax are call-clobbered and thus still have the   values we set just above.  Fetch from there the new stack pointer   we will run on, and jmp to the run-time address of `init1'; when it   returns, it will run the user code with the argument data at the   top of the stack.  */asm ("switch_stacks:\n"     "	movl %eax, %esp\n"     "	jmp *%ecx");/* As in the stack-switching case, at this point our stack is unwound   and callers' registers restored, and only %ecx and %eax communicate   values from the lines above.  In this case we have stashed in %eax   the user code return address.  Push it on the top of the stack so   it acts as init1's return address, and then jump there.  */asm ("call_init1:\n"     "	push %eax\n"     "	jmp *%ecx\n");/* Do the first essential initializations that must precede all else.  */static inline voidfirst_init (void){  /* Initialize data structures so we can do RPCs.  */  __mach_init ();  RUN_HOOK (_hurd_preinit_hook, ());}#ifdef SHARED/* This function is called specially by the dynamic linker to do early   initialization of the shared C library before normal initializers   expecting a Posixoid environment can run.  It gets called with the   stack set up just as the user will see it, so it can switch stacks.  */void_dl_init_first (void){  first_init ();  init ((int *) __builtin_frame_address (0) + 2);}#endif#ifdef SHARED/* The regular posixland initialization is what goes into libc's   normal initializer.  *//* NOTE!  The linker notices the magical name `_init' and sets the DT_INIT   pointer in the dynamic section based solely on that.  It is convention   for this function to be in the `.init' section, but the symbol name is   the only thing that really matters!!  */strong_alias (posixland_init, _init);void__libc_init_first (int argc, char **argv, char **envp){  /* Everything was done in the shared library initializer, _init.  */}#elsestrong_alias (posixland_init, __libc_init_first);/* XXX This is all a crock and I am not happy with it.   This poorly-named function is called by static-start.S,   which should not exist at all.  */void_hurd_stack_setup (void){  intptr_t caller = (intptr_t) __builtin_return_address (0);  void doinit (intptr_t *data)    {      /* This function gets called with the argument data at TOS.  */      void doinit1 (void)	{	  init ((int *) __builtin_frame_address (0) + 2);	}      /* Push the user return address after the argument data, and then         jump to `doinit1' (above), so it is as if __libc_init_first's         caller had called `doinit1' with the argument data already on the         stack.  */      *--data = caller;      asm volatile ("movl %0, %%esp\n" /* Switch to new outermost stack.  */		    "movl $0, %%ebp\n" /* Clear outermost frame pointer.  */		    "jmp *%1" : : "r" (data), "r" (&doinit1) : "sp");      /* NOTREACHED */    }  first_init ();  _hurd_startup ((void **) __builtin_frame_address (0) + 2, &doinit);}#endif/* This function is defined here so that if this file ever gets into   ld.so we will get a link error.  Having this file silently included   in ld.so causes disaster, because the _init definition above will   cause ld.so to gain an init function, which is not a cool thing. */void_dl_start (void){  abort ();}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人国产免费视频| 麻豆精品在线观看| 色8久久精品久久久久久蜜| 中文字幕在线不卡一区二区三区| 懂色av中文字幕一区二区三区| 国产精品色一区二区三区| proumb性欧美在线观看| 自拍偷自拍亚洲精品播放| 色婷婷av一区二区三区之一色屋| 亚洲精品久久久久久国产精华液| 欧美色视频在线| 看片的网站亚洲| 国产无一区二区| 色88888久久久久久影院野外 | 欧美性极品少妇| 婷婷夜色潮精品综合在线| 欧美精品一区二区三区高清aⅴ | 国产精品无人区| 91国偷自产一区二区三区成为亚洲经典 | 欧美一区二区成人6969| 久久国产剧场电影| 国产精品久久久久影院| 欧美精品三级在线观看| 国产乱人伦偷精品视频不卡| 亚洲嫩草精品久久| 日韩精品一区二区三区中文精品| 成人深夜在线观看| 日韩av一区二区三区四区| 欧美激情综合网| 欧美美女直播网站| 国产成人高清视频| 五月婷婷另类国产| 国产精品人人做人人爽人人添 | 免费看精品久久片| 亚洲欧洲精品成人久久奇米网| 欧美精品视频www在线观看| 国产999精品久久久久久绿帽| 亚洲成人午夜电影| 久久精品视频在线免费观看| 欧美欧美午夜aⅴ在线观看| 成人高清av在线| 久久精工是国产品牌吗| 一区二区三区四区视频精品免费 | 不卡av在线免费观看| 久久精品国产99国产精品| 亚洲激情图片qvod| 国产精品天干天干在观线| 日韩午夜三级在线| 欧美挠脚心视频网站| 99国产精品视频免费观看| 国内精品国产成人国产三级粉色| 亚洲午夜在线观看视频在线| 中文字幕中文字幕在线一区| 26uuuu精品一区二区| 91精品国产品国语在线不卡| 欧美曰成人黄网| www.亚洲在线| 成人午夜私人影院| 韩国av一区二区| 麻豆精品国产91久久久久久| 亚洲成人在线网站| 亚洲国产裸拍裸体视频在线观看乱了 | 成人99免费视频| 久久99国产精品免费网站| 天天综合网天天综合色| 亚洲国产sm捆绑调教视频| 亚洲免费在线电影| 日韩码欧中文字| 最新成人av在线| 亚洲乱码中文字幕综合| 亚洲欧美另类综合偷拍| 亚洲少妇中出一区| 亚洲蜜臀av乱码久久精品| 17c精品麻豆一区二区免费| 中文字幕中文字幕一区二区| 国产精品美女久久久久久| 国产精品丝袜一区| 国产精品理论在线观看| 国产精品人成在线观看免费 | 成人h动漫精品| 东方aⅴ免费观看久久av| 国产不卡免费视频| 成人a免费在线看| 91美女精品福利| 欧美网站大全在线观看| 欧美另类久久久品| 欧美α欧美αv大片| 国产日韩欧美精品电影三级在线| 国产清纯在线一区二区www| 亚洲国产精品传媒在线观看| 亚洲欧美国产毛片在线| 亚洲成人免费在线观看| 狂野欧美性猛交blacked| 国产激情视频一区二区三区欧美 | 日韩黄色免费电影| 美女尤物国产一区| 国产激情91久久精品导航| www.av亚洲| 欧美军同video69gay| 日韩精品一区二区三区swag| 国产亚洲综合av| 一区二区三区四区不卡视频| 日欧美一区二区| 成人三级伦理片| 欧美色欧美亚洲另类二区| 日韩女优视频免费观看| 国产肉丝袜一区二区| 伊人婷婷欧美激情| 久久精品国产99国产精品| 99视频一区二区| 欧美一级欧美一级在线播放| 国产精品理论在线观看| 视频在线在亚洲| 波多野结衣中文字幕一区二区三区| 欧洲日韩一区二区三区| 久久久噜噜噜久噜久久综合| 一区二区三区在线视频观看 | 综合久久久久综合| 男人的j进女人的j一区| 99久久婷婷国产| 日韩免费观看高清完整版| 国产精品第四页| 精品综合久久久久久8888| 91传媒视频在线播放| 久久先锋影音av鲁色资源| 亚洲一二三区在线观看| 国产成人日日夜夜| 日韩一区二区三区在线视频| 中文字幕一区二区三区四区不卡 | 国产精品视频观看| 蜜桃久久久久久久| 在线视频国内自拍亚洲视频| 久久伊人中文字幕| 五月激情六月综合| 色菇凉天天综合网| 国产精品国产a| 国产真实乱对白精彩久久| 5月丁香婷婷综合| 一区二区三区四区在线免费观看 | 蜜桃久久久久久| 欧美性生活久久| 亚洲色图视频网| 国产精品白丝jk黑袜喷水| 欧美一级生活片| 天天色天天操综合| 色久综合一二码| 最近中文字幕一区二区三区| 岛国一区二区在线观看| 国产亚洲一区二区在线观看| 激情久久五月天| 日韩丝袜情趣美女图片| 日韩精品一级二级| 欧美精品免费视频| 五月天欧美精品| 7777精品伊人久久久大香线蕉的 | 日韩不卡一区二区| 欧美日韩国产一区| 亚洲国产视频一区二区| 91豆麻精品91久久久久久| 亚洲激情网站免费观看| 91国偷自产一区二区三区成为亚洲经典 | 97se亚洲国产综合自在线观| www国产亚洲精品久久麻豆| 免费观看91视频大全| 欧美二区三区91| 日日夜夜精品视频免费| 欧美精品久久99久久在免费线| 亚洲成年人影院| 91精品欧美综合在线观看最新| 日本欧美一区二区三区| 日韩亚洲欧美在线| 极品少妇xxxx精品少妇偷拍| 国产午夜亚洲精品理论片色戒| 国产成人高清在线| 亚洲欧美一区二区三区国产精品| 99麻豆久久久国产精品免费| 樱桃国产成人精品视频| 在线成人免费观看| 精品一区二区三区影院在线午夜| 337p日本欧洲亚洲大胆色噜噜| 成人在线视频首页| 亚洲欧美视频在线观看视频| 欧美日韩免费视频| 久久成人精品无人区| 欧美国产日韩在线观看| 日本高清无吗v一区| 日韩黄色免费电影| 国产亚洲精久久久久久| 色嗨嗨av一区二区三区| 91女人视频在线观看| 一区二区成人在线视频| 欧美一区二区三区精品| 成人午夜视频福利| 亚洲二区视频在线| 精品国产免费人成在线观看| 99riav久久精品riav| 欧美aaaaaa午夜精品| 国产精品国产三级国产普通话蜜臀| 欧美综合一区二区| 国产精品主播直播|