1 /* 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef WEBRTC_BASE_LATEBINDINGSYMBOLTABLE_H_ 12 #define WEBRTC_BASE_LATEBINDINGSYMBOLTABLE_H_ 13 14 #include <string.h> 15 16 #include "webrtc/base/common.h" 17 18 namespace rtc { 19 20 #if defined(WEBRTC_POSIX) 21 typedef void *DllHandle; 22 #else 23 #error Not implemented for this platform 24 #endif 25 26 // This is the base class for "symbol table" classes to simplify the dynamic 27 // loading of symbols from DLLs. Currently the implementation only supports 28 // Linux and OS X, and pure C symbols (or extern "C" symbols that wrap C++ 29 // functions). Sub-classes for specific DLLs are generated via the "supermacro" 30 // files latebindingsymboltable.h.def and latebindingsymboltable.cc.def. See 31 // talk/sound/pulseaudiosymboltable.(h|cc) for an example. 32 class LateBindingSymbolTable { 33 public: 34 struct TableInfo { 35 const char *dll_name; 36 int num_symbols; 37 // Array of size num_symbols. 38 const char *const *symbol_names; 39 }; 40 41 LateBindingSymbolTable(const TableInfo *info, void **table); 42 ~LateBindingSymbolTable(); 43 44 bool IsLoaded() const; 45 // Loads the DLL and the symbol table. Returns true iff the DLL and symbol 46 // table loaded successfully. 47 bool Load(); 48 // Like load, but allows overriding the dll path for when the dll path is 49 // dynamic. 50 bool LoadFromPath(const char *dll_path); 51 void Unload(); 52 53 // Gets the raw OS handle to the DLL. Be careful what you do with it. GetDllHandle()54 DllHandle GetDllHandle() const { return handle_; } 55 56 private: 57 void ClearSymbols(); 58 59 const TableInfo *info_; 60 void **table_; 61 DllHandle handle_; 62 bool undefined_symbols_; 63 64 RTC_DISALLOW_COPY_AND_ASSIGN(LateBindingSymbolTable); 65 }; 66 67 } // namespace rtc 68 69 #endif // WEBRTC_BASE_LATEBINDINGSYMBOLTABLE_H_ 70