forked from eden-emu/eden
		
	common: Add libc sigaction hook
This commit is contained in:
		
							parent
							
								
									9485b44d25
								
							
						
					
					
						commit
						d4ff9e191b
					
				
					 3 changed files with 68 additions and 0 deletions
				
			
		|  | @ -166,6 +166,13 @@ if (WIN32) | |||
|   target_link_libraries(common PRIVATE ntdll) | ||||
| endif() | ||||
| 
 | ||||
| if (NOT WIN32) | ||||
|   target_sources(common PRIVATE | ||||
|     signal_chain.cpp | ||||
|     signal_chain.h | ||||
|   ) | ||||
| endif() | ||||
| 
 | ||||
| if(ANDROID) | ||||
|     target_sources(common | ||||
|         PRIVATE | ||||
|  |  | |||
							
								
								
									
										42
									
								
								src/common/signal_chain.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/common/signal_chain.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | |||
| // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
 | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later
 | ||||
| 
 | ||||
| #include <dlfcn.h> | ||||
| 
 | ||||
| #include "common/assert.h" | ||||
| #include "common/dynamic_library.h" | ||||
| #include "common/scope_exit.h" | ||||
| #include "common/signal_chain.h" | ||||
| 
 | ||||
| namespace Common { | ||||
| 
 | ||||
| template <typename T> | ||||
| T* LookupLibcSymbol(const char* name) { | ||||
| #if defined(__BIONIC__) | ||||
|     Common::DynamicLibrary provider("libc.so"); | ||||
|     if (!provider.IsOpen()) { | ||||
|         UNREACHABLE_MSG("Failed to open libc!"); | ||||
|     } | ||||
| #else | ||||
|     // For other operating environments, we assume the symbol is not overriden.
 | ||||
|     const char* base = nullptr; | ||||
|     Common::DynamicLibrary provider(base); | ||||
| #endif | ||||
| 
 | ||||
|     void* sym = provider.GetSymbolAddress(name); | ||||
|     if (sym == nullptr) { | ||||
|         sym = dlsym(RTLD_DEFAULT, name); | ||||
|     } | ||||
|     if (sym == nullptr) { | ||||
|         UNREACHABLE_MSG("Unable to find symbol {}!", name); | ||||
|     } | ||||
| 
 | ||||
|     return reinterpret_cast<T*>(sym); | ||||
| } | ||||
| 
 | ||||
| int SigAction(int signum, const struct sigaction* act, struct sigaction* oldact) { | ||||
|     static auto libc_sigaction = LookupLibcSymbol<decltype(sigaction)>("sigaction"); | ||||
|     return libc_sigaction(signum, act, oldact); | ||||
| } | ||||
| 
 | ||||
| } // namespace Common
 | ||||
							
								
								
									
										19
									
								
								src/common/signal_chain.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/common/signal_chain.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
 | ||||
| // SPDX-License-Identifier: GPL-2.0-or-later
 | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #ifndef _WIN32 | ||||
| 
 | ||||
| #include <signal.h> | ||||
| 
 | ||||
| namespace Common { | ||||
| 
 | ||||
| // Android's ART overrides sigaction with its own wrapper. This is problematic for SIGSEGV
 | ||||
| // in particular, because ARTs handler access TPIDR_EL0, so this extracts the libc version
 | ||||
| // and calls it directly.
 | ||||
| int SigAction(int signum, const struct sigaction* act, struct sigaction* oldact); | ||||
| 
 | ||||
| } // namespace Common
 | ||||
| 
 | ||||
| #endif | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 GPUCode
						GPUCode