⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libdl.c

📁 Axis 221 camera embedded programing interface
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (dl_brk != NULL) {			_dl_debug_addr->r_state = RT_ADD;			(*dl_brk) ();			_dl_debug_addr->r_state = RT_CONSISTENT;			(*dl_brk) ();		}	}#if defined (__LIBDL_SHARED__)	/* Run the ctors and setup the dtors */	for (i = nlist; i; --i) {		tpnt = init_fini_list[i-1];		if (tpnt->init_flag & INIT_FUNCS_CALLED)			continue;		tpnt->init_flag |= INIT_FUNCS_CALLED;		if (tpnt->dynamic_info[DT_INIT]) {			void (*dl_elf_func) (void);			dl_elf_func = (void (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_INIT]);			if (dl_elf_func && *dl_elf_func != NULL) {#ifdef __SUPPORT_LD_DEBUG__				if(_dl_debug)					fprintf(stderr, "running ctors for library %s at '%x'\n", tpnt->libname, dl_elf_func);#endif				(*dl_elf_func) ();			}		}	}#endif	_dl_unmap_cache();	return (void *) dyn_chain;oops:	/* Something went wrong.  Clean up and return NULL. */	_dl_unmap_cache();	do_dlclose(dyn_chain, 0);	return NULL;}void *dlsym(void *vhandle, const char *name){	struct elf_resolve *tpnt, *tfrom;	struct dyn_elf *handle;	ElfW(Addr) from;	struct dyn_elf *rpnt;	void *ret;	handle = (struct dyn_elf *) vhandle;	/* First of all verify that we have a real handle	   of some kind.  Return NULL if not a valid handle. */	if (handle == NULL)		handle = _dl_symbol_tables;	else if (handle != RTLD_NEXT && handle != _dl_symbol_tables) {		for (rpnt = _dl_handles; rpnt; rpnt = rpnt->next_handle)			if (rpnt == handle)				break;		if (!rpnt) {			_dl_error_number = LD_BAD_HANDLE;			return NULL;		}	} else if (handle == RTLD_NEXT) {		/*		 * Try and locate the module we were called from - we		 * need this so that we know where to start searching		 * from.  We never pass RTLD_NEXT down into the actual		 * dynamic loader itself, as it doesn't know		 * how to properly treat it.		 */		from = (ElfW(Addr)) __builtin_return_address(0);		tfrom = NULL;		for (rpnt = _dl_symbol_tables; rpnt; rpnt = rpnt->next) {			tpnt = rpnt->dyn;			if (tpnt->loadaddr < from					&& (tfrom == NULL || tfrom->loadaddr < tpnt->loadaddr)) {				tfrom = tpnt;				handle = rpnt->next;			}		}	}	ret = _dl_find_hash((char*)name, handle, NULL, 0);	/*	 * Nothing found.	 */	if (!ret)		_dl_error_number = LD_NO_SYMBOL;	return ret;}static int do_dlclose(void *vhandle, int need_fini){	struct dyn_elf *rpnt, *rpnt1;	struct init_fini_list *runp, *tmp;	ElfW(Phdr) *ppnt;	struct elf_resolve *tpnt;	int (*dl_elf_fini) (void);	void (*dl_brk) (void);	struct dyn_elf *handle;	unsigned int end;	int i = 0;	handle = (struct dyn_elf *) vhandle;	rpnt1 = NULL;	for (rpnt = _dl_handles; rpnt; rpnt = rpnt->next_handle) {		if (rpnt == handle)			break;		rpnt1 = rpnt;	}	if (!rpnt) {		_dl_error_number = LD_BAD_HANDLE;		return 1;	}	if (rpnt1)		rpnt1->next_handle = rpnt->next_handle;	else		_dl_handles = rpnt->next_handle;	if (need_fini) {		for (i = 0; i < handle->init_fini.nlist; ++i) {			tpnt = handle->init_fini.init_fini[i];			if (tpnt->dynamic_info[DT_FINI] && tpnt->usage_count == 1 &&			    !(tpnt->init_flag & FINI_FUNCS_CALLED)) {				tpnt->init_flag |= FINI_FUNCS_CALLED;				dl_elf_fini = (int (*)(void)) (tpnt->loadaddr + tpnt->dynamic_info[DT_FINI]);#ifdef __SUPPORT_LD_DEBUG__				if(_dl_debug)					fprintf(stderr, "running dtors for library %s at '%x'\n", tpnt->libname, dl_elf_fini);#endif				(*dl_elf_fini) ();			}		}	}	if (handle->dyn->usage_count == 1)		free(handle->init_fini.init_fini);	/* OK, this is a valid handle - now close out the file */	for (rpnt = handle; rpnt; rpnt = rpnt->next) {		tpnt = rpnt->dyn;		if (--tpnt->usage_count == 0) {			end = 0;			for (i = 0, ppnt = tpnt->ppnt;					i < tpnt->n_phent; ppnt++, i++) {				if (ppnt->p_type != PT_LOAD)					continue;				if (end < ppnt->p_vaddr + ppnt->p_memsz)					end = ppnt->p_vaddr + ppnt->p_memsz;			}			_dl_munmap((void*)tpnt->loadaddr, end);			/* Free elements in RTLD_LOCAL scope list */ 			for (runp = tpnt->rtld_local; runp; runp = tmp) {				tmp = runp->next;				free(runp);			}			/* Next, remove tpnt from the loaded_module list */			if (_dl_loaded_modules == tpnt) {				_dl_loaded_modules = tpnt->next;				if (_dl_loaded_modules)					_dl_loaded_modules->prev = 0;			} else				for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next)					if (tpnt->next == rpnt->dyn) {						tpnt->next = tpnt->next->next;						if (tpnt->next)							tpnt->next->prev = tpnt;						break;					}			/* Next, remove tpnt from the global symbol table list */			if (_dl_symbol_tables->dyn == rpnt->dyn) {				_dl_symbol_tables = rpnt->next;				if (_dl_symbol_tables)					_dl_symbol_tables->prev = 0;			} else				for (rpnt1 = _dl_symbol_tables; rpnt1->next; rpnt1 = rpnt1->next) {					if (rpnt1->next->dyn == rpnt->dyn) {						free(rpnt1->next);						rpnt1->next = rpnt1->next->next;						if (rpnt1->next)							rpnt1->next->prev = rpnt1;						break;					}				}			free(rpnt->dyn->libname);			free(rpnt->dyn);		}		free(rpnt);	}	if (_dl_debug_addr) {		dl_brk = (void (*)(void)) _dl_debug_addr->r_brk;		if (dl_brk != NULL) {			_dl_debug_addr->r_state = RT_DELETE;			(*dl_brk) ();			_dl_debug_addr->r_state = RT_CONSISTENT;			(*dl_brk) ();		}	}	return 0;}int dlclose(void *vhandle){	return do_dlclose(vhandle, 1);}char *dlerror(void){	const char *retval;	if (!_dl_error_number)		return NULL;	retval = dl_error_names[_dl_error_number];	_dl_error_number = 0;	return retval;}/* * Dump information to stderrr about the current loaded modules */static char *type[] = { "Lib", "Exe", "Int", "Mod" };int dlinfo(void){	struct elf_resolve *tpnt;	struct dyn_elf *rpnt, *hpnt;	fprintf(stderr, "List of loaded modules\n");	/* First start with a complete list of all of the loaded files. */	for (tpnt = _dl_loaded_modules; tpnt; tpnt = tpnt->next) {		fprintf(stderr, "\t%x %x %x %s %d %s\n",				(unsigned) tpnt->loadaddr, (unsigned) tpnt,				(unsigned) tpnt->symbol_scope,				type[tpnt->libtype],				tpnt->usage_count, tpnt->libname);	}	/* Next dump the module list for the application itself */	fprintf(stderr, "\nModules for application (%x):\n",			(unsigned) _dl_symbol_tables);	for (rpnt = _dl_symbol_tables; rpnt; rpnt = rpnt->next)		fprintf(stderr, "\t%x %s\n", (unsigned) rpnt->dyn, rpnt->dyn->libname);	for (hpnt = _dl_handles; hpnt; hpnt = hpnt->next_handle) {		fprintf(stderr, "Modules for handle %x\n", (unsigned) hpnt);		for (rpnt = hpnt; rpnt; rpnt = rpnt->next)			fprintf(stderr, "\t%x %s\n", (unsigned) rpnt->dyn,					rpnt->dyn->libname);	}	return 0;}int dladdr(const void *__address, Dl_info * __info){	struct elf_resolve *pelf;	struct elf_resolve *rpnt;	_dl_map_cache();	/*	 * Try and locate the module address is in	 */	pelf = NULL;#if 0	fprintf(stderr, "dladdr( %x, %x )\n", __address, __info);#endif	for (rpnt = _dl_loaded_modules; rpnt; rpnt = rpnt->next) {		struct elf_resolve *tpnt;		tpnt = rpnt;#if 0		fprintf(stderr, "Module \"%s\" at %x\n",				tpnt->libname, tpnt->loadaddr);#endif		if (tpnt->loadaddr < (ElfW(Addr)) __address				&& (pelf == NULL || pelf->loadaddr < tpnt->loadaddr)) {			pelf = tpnt;		}	}	if (!pelf) {		return 0;	}	/*	 * Try and locate the symbol of address	 */	{		char *strtab;		Elf32_Sym *symtab;		int hn, si;		int sf;		int sn = 0;		ElfW(Addr) sa;		sa = 0;		symtab = (Elf32_Sym *) (pelf->dynamic_info[DT_SYMTAB] + pelf->loadaddr);		strtab = (char *) (pelf->dynamic_info[DT_STRTAB] + pelf->loadaddr);		sf = 0;		for (hn = 0; hn < pelf->nbucket; hn++) {			for (si = pelf->elf_buckets[hn]; si; si = pelf->chains[si]) {				ElfW(Addr) symbol_addr;				symbol_addr = pelf->loadaddr + symtab[si].st_value;				if (symbol_addr <= (ElfW(Addr))__address && (!sf || sa < symbol_addr)) {					sa = symbol_addr;					sn = si;					sf = 1;				}#if 0				fprintf(stderr, "Symbol \"%s\" at %x\n",						strtab + symtab[si].st_name, symbol_addr);#endif			}		}		if (sf) {			__info->dli_fname = pelf->libname;			__info->dli_fbase = (void *)pelf->loadaddr;			__info->dli_sname = strtab + symtab[sn].st_name;			__info->dli_saddr = (void *)sa;		}		return 1;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -