Dump linux vDSO symbols
This commit is contained in:
		
							parent
							
								
									ad9db42aa4
								
							
						
					
					
						commit
						3582376f35
					
				| @ -12,9 +12,9 @@ if [ ! -d "depot_tools" ]; then | |||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| if [ ! -d "src" ]; then | if [ ! -d "src" ]; then | ||||||
|   ./depot_tools/fetch --nohooks breakpad |   PYTHONDONTWRITEBYTECODE=1 python2.7 ./depot_tools/fetch.py --nohooks breakpad | ||||||
| else | else | ||||||
|   ./depot_tools/gclient sync --nohooks |   PYTHONDONTWRITEBYTECODE=1 python2.7 ./depot_tools/gclient.py sync --nohooks | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| if [ ! -d "build" ]; then | if [ ! -d "build" ]; then | ||||||
|  | |||||||
| @ -487,6 +487,35 @@ class UploadThread: public IThread | |||||||
| #if defined _LINUX | #if defined _LINUX | ||||||
| 	bool UploadSymbolFile(const google_breakpad::CodeModule *module, const char *presubmitToken) { | 	bool UploadSymbolFile(const google_breakpad::CodeModule *module, const char *presubmitToken) { | ||||||
| 		auto debugFile = module->debug_file(); | 		auto debugFile = module->debug_file(); | ||||||
|  | 		std::string vdsoOutputPath = ""; | ||||||
|  | 
 | ||||||
|  | 		if (debugFile == "linux-gate.so") { | ||||||
|  | 			char vdsoOutputPathBuffer[512]; | ||||||
|  | 			g_pSM->BuildPath(Path_SM, vdsoOutputPathBuffer, sizeof(vdsoOutputPathBuffer), "data/dumps/linux-gate.so"); | ||||||
|  | 			vdsoOutputPath = vdsoOutputPathBuffer; | ||||||
|  | 			int auxvStart = 0; | ||||||
|  | 			while (environ[auxvStart++] != nullptr); | ||||||
|  | 			struct { | ||||||
|  | 				int id; | ||||||
|  | 				void *value; | ||||||
|  | 			} *auxvEntry = (decltype(auxvEntry))&environ[auxvStart]; | ||||||
|  | 			for (int auxvIndex = 0; true; ++auxvIndex) { | ||||||
|  | 				if (auxvEntry[auxvIndex].id == 0) break; | ||||||
|  | 				if (auxvEntry[auxvIndex].id != 33) continue; // AT_SYSINFO_EHDR
 | ||||||
|  | 				Elf32_Ehdr *vdsoHdr = (Elf32_Ehdr *)auxvEntry[auxvIndex].value; | ||||||
|  | 				auto vdsoSize = vdsoHdr->e_shoff + (vdsoHdr->e_shentsize * vdsoHdr->e_shnum); | ||||||
|  | 				void *vdsoBuffer = malloc(vdsoSize); | ||||||
|  | 				memcpy(vdsoBuffer, vdsoHdr, vdsoSize); | ||||||
|  | 				FILE *vdsoFile = fopen(vdsoOutputPath.c_str(), "wb"); | ||||||
|  | 				if (vdsoFile) { | ||||||
|  | 					fwrite(vdsoBuffer, 1, vdsoSize, vdsoFile); | ||||||
|  | 					fclose(vdsoFile); | ||||||
|  | 					debugFile = vdsoOutputPath; | ||||||
|  | 				} | ||||||
|  | 				free(vdsoBuffer); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		if (debugFile[0] != '/') { | 		if (debugFile[0] != '/') { | ||||||
| 			return false; | 			return false; | ||||||
| 		} | 		} | ||||||
| @ -522,6 +551,10 @@ class UploadThread: public IThread | |||||||
| 		// output = output.substr(0, output.find("\n"));
 | 		// output = output.substr(0, output.find("\n"));
 | ||||||
| 		// printf(">>> %s\n", output.c_str());
 | 		// printf(">>> %s\n", output.c_str());
 | ||||||
| 
 | 
 | ||||||
|  | 		if (debugFile == vdsoOutputPath) { | ||||||
|  | 			unlink(vdsoOutputPath.c_str()); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		IWebForm *form = webternet->CreateForm(); | 		IWebForm *form = webternet->CreateForm(); | ||||||
| 
 | 
 | ||||||
| 		const char *minidumpAccount = g_pSM->GetCoreConfigValue("MinidumpAccount"); | 		const char *minidumpAccount = g_pSM->GetCoreConfigValue("MinidumpAccount"); | ||||||
| @ -691,6 +724,10 @@ class UploadThread: public IThread | |||||||
| 		const auto &codeFile = module->code_file(); | 		const auto &codeFile = module->code_file(); | ||||||
| 
 | 
 | ||||||
| #ifndef WIN32 | #ifndef WIN32 | ||||||
|  | 		if (codeFile == "linux-gate.so") { | ||||||
|  | 			return kMTSystem; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		if (codeFile[0] != '/') { | 		if (codeFile[0] != '/') { | ||||||
| #else | #else | ||||||
| 		if (codeFile[1] != ':') { | 		if (codeFile[1] != ':') { | ||||||
|  | |||||||
| @ -237,6 +237,35 @@ int main(int argc, char *argv[]) | |||||||
| 			auto module = processState.modules()->GetModuleAtIndex(moduleIndex); | 			auto module = processState.modules()->GetModuleAtIndex(moduleIndex); | ||||||
| 
 | 
 | ||||||
| 			auto debugFile = module->debug_file(); | 			auto debugFile = module->debug_file(); | ||||||
|  | 			std::string vdsoOutputPath = ""; | ||||||
|  | 
 | ||||||
|  | 			if (debugFile == "linux-gate.so") { | ||||||
|  | 				auto workingDir = getcwd(nullptr, 0); | ||||||
|  | 				vdsoOutputPath = workingDir + std::string("/linux-gate.so"); | ||||||
|  | 				int auxvStart = 0; | ||||||
|  | 				while (environ[auxvStart++] != nullptr); | ||||||
|  | 				struct { | ||||||
|  | 					int id; | ||||||
|  | 					void *value; | ||||||
|  | 				} *auxvEntry = (decltype(auxvEntry))&environ[auxvStart]; | ||||||
|  | 				for (int auxvIndex = 0; true; ++auxvIndex) { | ||||||
|  | 					if (auxvEntry[auxvIndex].id == 0) break; | ||||||
|  | 					if (auxvEntry[auxvIndex].id != 33) continue; // AT_SYSINFO_EHDR
 | ||||||
|  | 					Elf32_Ehdr *vdsoHdr = (Elf32_Ehdr *)auxvEntry[auxvIndex].value; | ||||||
|  | 					auto vdsoSize = vdsoHdr->e_shoff + (vdsoHdr->e_shentsize * vdsoHdr->e_shnum); | ||||||
|  | 					void *vdsoBuffer = malloc(vdsoSize); | ||||||
|  | 					memcpy(vdsoBuffer, vdsoHdr, vdsoSize); | ||||||
|  | 					FILE *vdsoFile = fopen(vdsoOutputPath.c_str(), "wb"); | ||||||
|  | 					if (vdsoFile) { | ||||||
|  | 						fwrite(vdsoBuffer, 1, vdsoSize, vdsoFile); | ||||||
|  | 						fclose(vdsoFile); | ||||||
|  | 						debugFile = vdsoOutputPath; | ||||||
|  | 					} | ||||||
|  | 					free(vdsoBuffer); | ||||||
|  | 				} | ||||||
|  | 				free(workingDir); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 			if (debugFile[0] != '/') { | 			if (debugFile[0] != '/') { | ||||||
| 				continue; | 				continue; | ||||||
| 			} | 			} | ||||||
| @ -272,6 +301,10 @@ int main(int argc, char *argv[]) | |||||||
| 			auto output = outputStream.str(); | 			auto output = outputStream.str(); | ||||||
| 			output = output.substr(0, output.find("\n")); | 			output = output.substr(0, output.find("\n")); | ||||||
| 			printf("%s\n", output.c_str()); | 			printf("%s\n", output.c_str()); | ||||||
|  | 
 | ||||||
|  | 			if (debugFile == vdsoOutputPath) { | ||||||
|  | 				unlink(vdsoOutputPath.c_str()); | ||||||
|  | 			} | ||||||
| 		} | 		} | ||||||
| #endif | #endif | ||||||
| 	} | 	} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user