All pastes #900391 Raw Edit

Unnamed

public text v1 · immutable
·published 2008-02-11 21:41 UTC
rendered paste body
Index: mach_lookup/mach_lookup.c
===================================================================
--- mach_lookup/mach_lookup.c	(revision 124)
+++ mach_lookup/mach_lookup.c	(working copy)
@@ -77,25 +77,43 @@
 	// if we failed to find any one of the load commands we need, bail out
 	if (text_seg_cmd == NULL || linkedit_seg_cmd == NULL || symtab_cmd == NULL || dysymtab_cmd == NULL) return NULL;
 	
-//	uint32_t vm_symoff = (symtab_cmd->symoff - linkedit_seg_cmd->fileoff);
+	//uint32_t vm_symoff = (symtab_cmd->symoff - linkedit_seg_cmd->fileoff);
 	uint32_t vm_stroff = (symtab_cmd->stroff - symtab_cmd->symoff);
 	
 	// get the address of the symtab and the first externally defined symbol symtab entry
-	
 	struct nlist* symtab = (struct nlist*)(linkedit_seg_cmd->vmaddr);
-	char** name_tbl = generate_nametbl((char*)(linkedit_seg_cmd->vmaddr + vm_stroff), symtab_cmd->strsize);
 	
+	//char** name_tbl = generate_nametbl((char*)(linkedit_seg_cmd->vmaddr + vm_stroff), symtab_cmd->strsize);
+	char *name_tbl = (char *)(linkedit_seg_cmd->vmaddr + vm_stroff);
+	
+	// Loop through the symtab looking for 
 	uint32_t isym = 0;
-	for (; isym < symtab_cmd->nsyms; isym++) {
+	uint8_t count = 0;
+	while (count < 2) {
 		struct nlist c = symtab[isym];
-		if (c.n_un.n_strx != 0) printf("%s\n", name_tbl[c.n_un.n_strx]);
-		else printf("anonymous\n");
-		if (strcmp(name_tbl[c.n_un.n_strx], symbol) == 0) {
-			printf("*** %s is at %p\n", name_tbl[c.n_un.n_strx], c.n_value);
+		
+		// we start and end with __no_local_symbols_in_dyld_shared_cache
+		if(c.n_un.n_strx == 0) {
+			count ++; isym ++;
+			if(count == 2) break;
+			else continue;
 		}
+		
+		if (name_tbl[c.n_un.n_strx] != 0) {
+			//printf("%s at %p\n", name_tbl + c.n_un.n_strx, c.n_value);
+			if (strcmp(name_tbl + c.n_un.n_strx, symbol) == 0) {
+				return (void *)c.n_value;
+			}
+		} else {
+			//printf("(anonymous) at %p\n", c.n_value);
+		}
+		
+		isym ++;
 	}
 	
-	free(name_tbl);
+	//printf("There were %d symbols\n", isym - 2);
 	
+	//free(name_tbl);
+	
 	return NULL;
 }