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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dl-machine.c

?? glibc 2.9,最新版的C語言庫函數
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* Machine-dependent ELF dynamic relocation functions.  PowerPC version.   Copyright (C) 1995-2006, 2008 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 <unistd.h>#include <string.h>#include <sys/param.h>#include <link.h>#include <ldsodefs.h>#include <elf/dynamic-link.h>#include <dl-machine.h>#include <stdio-common/_itoa.h>/* The value __cache_line_size is defined in dl-sysdep.c and is initialised   by _dl_sysdep_start via DL_PLATFORM_INIT.  */extern int __cache_line_size attribute_hidden;/* Because ld.so is now versioned, these functions can be in their own file;   no relocations need to be done to call them.   Of course, if ld.so is not versioned...  */#if defined SHARED && !(DO_VERSIONING - 0)#error This will not work with versioning turned off, sorry.#endif/* Stuff for the PLT.  */#define PLT_INITIAL_ENTRY_WORDS 18#define PLT_LONGBRANCH_ENTRY_WORDS 0#define PLT_TRAMPOLINE_ENTRY_WORDS 6#define PLT_DOUBLE_SIZE (1<<13)#define PLT_ENTRY_START_WORDS(entry_number) \  (PLT_INITIAL_ENTRY_WORDS + (entry_number)*2				\   + ((entry_number) > PLT_DOUBLE_SIZE					\      ? ((entry_number) - PLT_DOUBLE_SIZE)*2				\      : 0))#define PLT_DATA_START_WORDS(num_entries) PLT_ENTRY_START_WORDS(num_entries)/* Macros to build PowerPC opcode words.  */#define OPCODE_ADDI(rd,ra,simm) \  (0x38000000 | (rd) << 21 | (ra) << 16 | ((simm) & 0xffff))#define OPCODE_ADDIS(rd,ra,simm) \  (0x3c000000 | (rd) << 21 | (ra) << 16 | ((simm) & 0xffff))#define OPCODE_ADD(rd,ra,rb) \  (0x7c000214 | (rd) << 21 | (ra) << 16 | (rb) << 11)#define OPCODE_B(target) (0x48000000 | ((target) & 0x03fffffc))#define OPCODE_BA(target) (0x48000002 | ((target) & 0x03fffffc))#define OPCODE_BCTR() 0x4e800420#define OPCODE_LWZ(rd,d,ra) \  (0x80000000 | (rd) << 21 | (ra) << 16 | ((d) & 0xffff))#define OPCODE_LWZU(rd,d,ra) \  (0x84000000 | (rd) << 21 | (ra) << 16 | ((d) & 0xffff))#define OPCODE_MTCTR(rd) (0x7C0903A6 | (rd) << 21)#define OPCODE_RLWINM(ra,rs,sh,mb,me) \  (0x54000000 | (rs) << 21 | (ra) << 16 | (sh) << 11 | (mb) << 6 | (me) << 1)#define OPCODE_LI(rd,simm)    OPCODE_ADDI(rd,0,simm)#define OPCODE_ADDIS_HI(rd,ra,value) \  OPCODE_ADDIS(rd,ra,((value) + 0x8000) >> 16)#define OPCODE_LIS_HI(rd,value) OPCODE_ADDIS_HI(rd,0,value)#define OPCODE_SLWI(ra,rs,sh) OPCODE_RLWINM(ra,rs,sh,0,31-sh)#define PPC_DCBST(where) asm volatile ("dcbst 0,%0" : : "r"(where) : "memory")#define PPC_SYNC asm volatile ("sync" : : : "memory")#define PPC_ISYNC asm volatile ("sync; isync" : : : "memory")#define PPC_ICBI(where) asm volatile ("icbi 0,%0" : : "r"(where) : "memory")#define PPC_DIE asm volatile ("tweq 0,0")/* Use this when you've modified some code, but it won't be in the   instruction fetch queue (or when it doesn't matter if it is). */#define MODIFIED_CODE_NOQUEUE(where) \     do { PPC_DCBST(where); PPC_SYNC; PPC_ICBI(where); } while (0)/* Use this when it might be in the instruction queue. */#define MODIFIED_CODE(where) \     do { PPC_DCBST(where); PPC_SYNC; PPC_ICBI(where); PPC_ISYNC; } while (0)/* The idea here is that to conform to the ABI, we are supposed to try   to load dynamic objects between 0x10000 (we actually use 0x40000 as   the lower bound, to increase the chance of a memory reference from   a null pointer giving a segfault) and the program's load address;   this may allow us to use a branch instruction in the PLT rather   than a computed jump.  The address is only used as a preference for   mmap, so if we get it wrong the worst that happens is that it gets   mapped somewhere else.  */ElfW(Addr)__elf_preferred_address (struct link_map *loader, size_t maplength,			 ElfW(Addr) mapstartpref){  ElfW(Addr) low, high;  struct link_map *l;  Lmid_t nsid;  /* If the object has a preference, load it there!  */  if (mapstartpref != 0)    return mapstartpref;  /* Otherwise, quickly look for a suitable gap between 0x3FFFF and     0x70000000.  0x3FFFF is so that references off NULL pointers will     cause a segfault, 0x70000000 is just paranoia (it should always     be superceded by the program's load address).  */  low =  0x0003FFFF;  high = 0x70000000;  for (nsid = 0; nsid < DL_NNS; ++nsid)    for (l = GL(dl_ns)[nsid]._ns_loaded; l; l = l->l_next)      {	ElfW(Addr) mapstart, mapend;	mapstart = l->l_map_start & ~(GLRO(dl_pagesize) - 1);	mapend = l->l_map_end | (GLRO(dl_pagesize) - 1);	assert (mapend > mapstart);	/* Prefer gaps below the main executable, note that l ==	   _dl_loaded does not work for static binaries loading	   e.g. libnss_*.so.  */	if ((mapend >= high || l->l_type == lt_executable)  	    && high >= mapstart)	  high = mapstart;	else if (mapend >= low && low >= mapstart)	  low = mapend;	else if (high >= mapend && mapstart >= low)	  {	    if (high - mapend >= mapstart - low)	      low = mapend;	    else	      high = mapstart;	  }      }  high -= 0x10000; /* Allow some room between objects.  */  maplength = (maplength | (GLRO(dl_pagesize) - 1)) + 1;  if (high <= low || high - low < maplength )    return 0;  return high - maplength;  /* Both high and maplength are page-aligned.  */}/* Set up the loaded object described by L so its unrelocated PLT   entries will jump to the on-demand fixup code in dl-runtime.c.   Also install a small trampoline to be used by entries that have   been relocated to an address too far away for a single branch.  *//* There are many kinds of PLT entries:   (1)	A direct jump to the actual routine, either a relative or	absolute branch.  These are set up in __elf_machine_fixup_plt.   (2)	Short lazy entries.  These cover the first 8192 slots in        the PLT, and look like (where 'index' goes from 0 to 8191):	li %r11, index*4	b  &plt[PLT_TRAMPOLINE_ENTRY_WORDS+1]   (3)	Short indirect jumps.  These replace (2) when a direct jump	wouldn't reach.  They look the same except that the branch	is 'b &plt[PLT_LONGBRANCH_ENTRY_WORDS]'.   (4)  Long lazy entries.  These cover the slots when a short entry	won't fit ('index*4' overflows its field), and look like:	lis %r11, %hi(index*4 + &plt[PLT_DATA_START_WORDS])	lwzu %r12, %r11, %lo(index*4 + &plt[PLT_DATA_START_WORDS])	b  &plt[PLT_TRAMPOLINE_ENTRY_WORDS]	bctr   (5)	Long indirect jumps.  These replace (4) when a direct jump	wouldn't reach.  They look like:	lis %r11, %hi(index*4 + &plt[PLT_DATA_START_WORDS])	lwz %r12, %r11, %lo(index*4 + &plt[PLT_DATA_START_WORDS])	mtctr %r12	bctr   (6) Long direct jumps.  These are used when thread-safety is not       required.  They look like:       lis %r12, %hi(finaladdr)       addi %r12, %r12, %lo(finaladdr)       mtctr %r12       bctr   The lazy entries, (2) and (4), are set up here in   __elf_machine_runtime_setup.  (1), (3), and (5) are set up in   __elf_machine_fixup_plt.  (1), (3), and (6) can also be constructed   in __process_machine_rela.   The reason for the somewhat strange construction of the long   entries, (4) and (5), is that we need to ensure thread-safety.  For   (1) and (3), this is obvious because only one instruction is   changed and the PPC architecture guarantees that aligned stores are   atomic.  For (5), this is more tricky.  When changing (4) to (5),   the `b' instruction is first changed to to `mtctr'; this is safe   and is why the `lwzu' instruction is not just a simple `addi'.   Once this is done, and is visible to all processors, the `lwzu' can   safely be changed to a `lwz'.  */int__elf_machine_runtime_setup (struct link_map *map, int lazy, int profile){  if (map->l_info[DT_JMPREL])    {      Elf32_Word i;      Elf32_Word *plt = (Elf32_Word *) D_PTR (map, l_info[DT_PLTGOT]);      Elf32_Word num_plt_entries = (map->l_info[DT_PLTRELSZ]->d_un.d_val				    / sizeof (Elf32_Rela));      Elf32_Word rel_offset_words = PLT_DATA_START_WORDS (num_plt_entries);      Elf32_Word data_words = (Elf32_Word) (plt + rel_offset_words);      Elf32_Word size_modified;      extern void _dl_runtime_resolve (void);      extern void _dl_prof_resolve (void);      /* Convert the index in r11 into an actual address, and get the	 word at that address.  */      plt[PLT_LONGBRANCH_ENTRY_WORDS] = OPCODE_ADDIS_HI (11, 11, data_words);      plt[PLT_LONGBRANCH_ENTRY_WORDS + 1] = OPCODE_LWZ (11, data_words, 11);      /* Call the procedure at that address.  */      plt[PLT_LONGBRANCH_ENTRY_WORDS + 2] = OPCODE_MTCTR (11);      plt[PLT_LONGBRANCH_ENTRY_WORDS + 3] = OPCODE_BCTR ();      if (lazy)	{	  Elf32_Word *tramp = plt + PLT_TRAMPOLINE_ENTRY_WORDS;	  Elf32_Word dlrr = (Elf32_Word)(profile					 ? _dl_prof_resolve					 : _dl_runtime_resolve);	  Elf32_Word offset;	  if (profile && GLRO(dl_profile) != NULL	      && _dl_name_match_p (GLRO(dl_profile), map))	    /* This is the object we are looking for.  Say that we really	       want profiling and the timers are started.  */	    GL(dl_profile_map) = map;	  /* For the long entries, subtract off data_words.  */	  tramp[0] = OPCODE_ADDIS_HI (11, 11, -data_words);	  tramp[1] = OPCODE_ADDI (11, 11, -data_words);	  /* Multiply index of entry by 3 (in r11).  */	  tramp[2] = OPCODE_SLWI (12, 11, 1);	  tramp[3] = OPCODE_ADD (11, 12, 11);	  if (dlrr <= 0x01fffffc || dlrr >= 0xfe000000)	    {	      /* Load address of link map in r12.  */	      tramp[4] = OPCODE_LI (12, (Elf32_Word) map);	      tramp[5] = OPCODE_ADDIS_HI (12, 12, (Elf32_Word) map);	      /* Call _dl_runtime_resolve.  */	      tramp[6] = OPCODE_BA (dlrr);	    }	  else	    {	      /* Get address of _dl_runtime_resolve in CTR.  */	      tramp[4] = OPCODE_LI (12, dlrr);	      tramp[5] = OPCODE_ADDIS_HI (12, 12, dlrr);	      tramp[6] = OPCODE_MTCTR (12);	      /* Load address of link map in r12.  */	      tramp[7] = OPCODE_LI (12, (Elf32_Word) map);	      tramp[8] = OPCODE_ADDIS_HI (12, 12, (Elf32_Word) map);	      /* Call _dl_runtime_resolve.  */	      tramp[9] = OPCODE_BCTR ();	    }	  /* Set up the lazy PLT entries.  */	  offset = PLT_INITIAL_ENTRY_WORDS;	  i = 0;	  while (i < num_plt_entries && i < PLT_DOUBLE_SIZE)	    {	      plt[offset  ] = OPCODE_LI (11, i * 4);	      plt[offset+1] = OPCODE_B ((PLT_TRAMPOLINE_ENTRY_WORDS + 2					 - (offset+1))					* 4);	      i++;	      offset += 2;	    }	  while (i < num_plt_entries)	    {	      plt[offset  ] = OPCODE_LIS_HI (11, i * 4 + data_words);	      plt[offset+1] = OPCODE_LWZU (12, i * 4 + data_words, 11);	      plt[offset+2] = OPCODE_B ((PLT_TRAMPOLINE_ENTRY_WORDS					 - (offset+2))					* 4);	      plt[offset+3] = OPCODE_BCTR ();	      i++;	      offset += 4;	    }	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品国产网站| 久久蜜桃香蕉精品一区二区三区| 亚洲欧美日韩一区| 9色porny自拍视频一区二区| 国产目拍亚洲精品99久久精品| 国产成人一级电影| 国产精品一二三在| 欧美激情一区二区三区四区| 北条麻妃国产九九精品视频| 亚洲欧美aⅴ...| 欧美日韩美少妇 | 成人免费在线视频| 91精品福利视频| 日韩精品久久理论片| 日韩精品一区二| 粉嫩13p一区二区三区| 亚洲人成在线播放网站岛国 | 成人网男人的天堂| 亚洲一区二区四区蜜桃| 日韩一级片在线观看| 国产精品77777| 亚洲成人三级小说| 国产肉丝袜一区二区| 在线观看亚洲a| 国产裸体歌舞团一区二区| 亚洲精品成人精品456| 欧美成人一区二区三区片免费| 白白色亚洲国产精品| 日韩有码一区二区三区| 欧美韩日一区二区三区四区| 欧美日韩综合在线| 成人黄色片在线观看| 日韩精品福利网| 亚洲人精品午夜| 久久精品视频网| 欧美性videosxxxxx| 成人午夜电影网站| 日韩国产一区二| 国产精品美女www爽爽爽| 欧美日韩国产小视频在线观看| 国产成人在线影院| 亚洲国产裸拍裸体视频在线观看乱了 | 91黄视频在线观看| 免费人成在线不卡| 亚洲综合男人的天堂| 国产网站一区二区三区| 91精品婷婷国产综合久久| www.亚洲在线| 国产成人免费在线观看不卡| 石原莉奈一区二区三区在线观看| 亚洲三级久久久| 国产日韩精品视频一区| 91精品国产一区二区三区香蕉| av一二三不卡影片| 国产精品1区2区3区在线观看| 婷婷一区二区三区| 亚洲精品中文字幕乱码三区| 欧美国产精品中文字幕| 日韩欧美电影一二三| 欧美日韩国产高清一区| 色av一区二区| 色综合天天天天做夜夜夜夜做| 国产91色综合久久免费分享| 国产一区二区三区在线观看免费| 免费成人在线网站| 日韩经典中文字幕一区| 亚洲午夜免费电影| 亚洲国产成人91porn| 亚洲午夜精品17c| 亚洲国产日产av| 丝袜美腿亚洲一区二区图片| 亚洲国产精品自拍| 日韩高清电影一区| 奇米影视一区二区三区| 美国十次综合导航| 捆绑调教美女网站视频一区| 久久精品噜噜噜成人av农村| 日产国产高清一区二区三区| 免费成人av资源网| 久久国内精品自在自线400部| 精品综合免费视频观看| 国内外成人在线| 成人午夜电影网站| 99久久99久久综合| 欧美性感一类影片在线播放| 欧美老肥妇做.爰bbww视频| 91精品一区二区三区在线观看| 日韩欧美一级二级三级| 欧美精品一区二区三| 国产欧美视频一区二区三区| 中文字幕一区二区三中文字幕| 亚洲视频你懂的| 亚洲超丰满肉感bbw| 日韩avvvv在线播放| 国内精品国产三级国产a久久| 国产在线精品一区二区| 成人综合在线观看| 色婷婷精品大视频在线蜜桃视频| 欧美日韩一二区| 欧美mv和日韩mv的网站| 欧美国产一区在线| 一区二区三国产精华液| 日韩av电影一区| 国产成人亚洲精品狼色在线| 色综合久久综合网欧美综合网| 欧美日韩国产一级| 国产欧美日韩亚州综合| 亚洲激情中文1区| 韩国理伦片一区二区三区在线播放| 成人免费三级在线| 91精品一区二区三区久久久久久| 国产欧美一区视频| 婷婷开心久久网| 成人一道本在线| 欧美精品三级日韩久久| 久久久午夜电影| 亚洲va中文字幕| 高清国产一区二区三区| 在线观看日韩电影| 亚洲精品一线二线三线| 亚洲综合精品自拍| 玖玖九九国产精品| 在线观看精品一区| 精品久久人人做人人爽| 亚洲综合一二三区| 国产成人精品亚洲777人妖| 欧美日韩亚洲丝袜制服| 国产精品久久久久四虎| 精品一区二区三区在线观看| 在线看日本不卡| 中文字幕一区二区三区在线播放| 日本欧美一区二区在线观看| 91啪亚洲精品| 国产精品污污网站在线观看| 老司机免费视频一区二区| 欧美三级在线播放| 亚洲三级在线免费| 国产一区二区毛片| 欧美一卡2卡三卡4卡5免费| 亚洲综合免费观看高清完整版| 成人av在线网| 久久久精品欧美丰满| 日日夜夜免费精品视频| 91亚洲国产成人精品一区二区三 | 欧美日韩亚洲综合一区二区三区| 亚洲国产精品二十页| 久久91精品久久久久久秒播| 欧美调教femdomvk| 亚洲精品久久久蜜桃| 99久久伊人网影院| 欧美国产精品一区| 国产99精品视频| 国产欧美在线观看一区| 国产揄拍国内精品对白| 日韩久久精品一区| 麻豆视频一区二区| 日韩一级高清毛片| 欧美aaaaaa午夜精品| 51午夜精品国产| 香蕉成人伊视频在线观看| 欧美亚洲免费在线一区| 亚洲一区在线视频观看| 91偷拍与自偷拍精品| 亚洲人成电影网站色mp4| 色一情一伦一子一伦一区| 亚洲天堂久久久久久久| 91视频免费播放| 亚洲自拍与偷拍| 欧美中文字幕一二三区视频| 亚洲精品视频一区| 欧美日韩精品一区二区| 三级欧美在线一区| 91精品国产日韩91久久久久久| 日韩av午夜在线观看| 欧美一卡二卡三卡四卡| 精品一区二区三区免费毛片爱| 欧美xxxx老人做受| 成人综合婷婷国产精品久久蜜臀| 欧美国产一区在线| 色综合咪咪久久| 日韩精品高清不卡| 欧美mv日韩mv国产网站| 成人永久免费视频| 亚洲激情在线播放| 欧美裸体一区二区三区| 久久成人免费日本黄色| 国产农村妇女精品| 一本色道久久加勒比精品 | 激情五月激情综合网| 国产女主播视频一区二区| 91免费视频网| 日本中文字幕不卡| 久久奇米777| 色一情一伦一子一伦一区| 视频一区中文字幕| 国产婷婷精品av在线| 91久久精品国产91性色tv| 免费成人性网站| 亚洲日穴在线视频| 在线播放中文字幕一区|