static void load_symbols(bool is_dummy) { if (is_dummy) { SYM_DUMMY(retro_init); SYM_DUMMY(retro_deinit); SYM_DUMMY(retro_api_version); SYM_DUMMY(retro_get_system_info); SYM_DUMMY(retro_get_system_av_info); SYM_DUMMY(retro_set_environment); SYM_DUMMY(retro_set_video_refresh); SYM_DUMMY(retro_set_audio_sample); SYM_DUMMY(retro_set_audio_sample_batch); SYM_DUMMY(retro_set_input_poll); SYM_DUMMY(retro_set_input_state); SYM_DUMMY(retro_set_controller_port_device); SYM_DUMMY(retro_reset); SYM_DUMMY(retro_run); SYM_DUMMY(retro_serialize_size); SYM_DUMMY(retro_serialize); SYM_DUMMY(retro_unserialize); SYM_DUMMY(retro_cheat_reset); SYM_DUMMY(retro_cheat_set); SYM_DUMMY(retro_load_game); SYM_DUMMY(retro_load_game_special); SYM_DUMMY(retro_unload_game); SYM_DUMMY(retro_get_region); SYM_DUMMY(retro_get_memory_data); SYM_DUMMY(retro_get_memory_size); } else { #ifdef HAVE_DYNAMIC if (path_is_directory(g_settings.libretro)) { char libretro_core_buffer[PATH_MAX]; if (!find_first_libretro(libretro_core_buffer, sizeof(libretro_core_buffer), g_settings.libretro, g_extern.fullpath)) { RARCH_ERR("libretro_path is a directory, but no valid libretro implementation was found.\n"); rarch_fail(1, "load_dynamic()"); } strlcpy(g_settings.libretro, libretro_core_buffer, sizeof(g_settings.libretro)); } // Need to use absolute path for this setting. It can be saved to ROM history, // and a relative path would break in that scenario. path_resolve_realpath(g_settings.libretro, sizeof(g_settings.libretro)); RARCH_LOG("Loading dynamic libretro from: \"%s\"\n", g_settings.libretro); lib_handle = dylib_load(g_settings.libretro); if (!lib_handle) { RARCH_ERR("Failed to open dynamic library: \"%s\"\n", g_settings.libretro); rarch_fail(1, "load_dynamic()"); } #endif SYM(retro_init); SYM(retro_deinit); SYM(retro_api_version); SYM(retro_get_system_info); SYM(retro_get_system_av_info); SYM(retro_set_environment); SYM(retro_set_video_refresh); SYM(retro_set_audio_sample); SYM(retro_set_audio_sample_batch); SYM(retro_set_input_poll); SYM(retro_set_input_state); SYM(retro_set_controller_port_device); SYM(retro_reset); SYM(retro_run); SYM(retro_serialize_size); SYM(retro_serialize); SYM(retro_unserialize); SYM(retro_cheat_reset); SYM(retro_cheat_set); SYM(retro_load_game); SYM(retro_load_game_special); SYM(retro_unload_game); SYM(retro_get_region); SYM(retro_get_memory_data); SYM(retro_get_memory_size); } }
/** * load_symbols: * @type : Type of core to be loaded. * If CORE_TYPE_DUMMY, will * load dummy symbols. * * Setup libretro callback symbols. **/ static void load_symbols(enum rarch_core_type type) { switch (type) { case CORE_TYPE_PLAIN: { #ifdef HAVE_DYNAMIC settings_t *settings = config_get_ptr(); function_t sym = dylib_proc(NULL, "retro_init"); if (sym) { /* Try to verify that -lretro was not linked in from other modules * since loading it dynamically and with -l will fail hard. */ RARCH_ERR("Serious problem. RetroArch wants to load libretro cores dyamically, but it is already linked.\n"); RARCH_ERR("This could happen if other modules RetroArch depends on link against libretro directly.\n"); RARCH_ERR("Proceeding could cause a crash. Aborting ...\n"); rarch_fail(1, "init_libretro_sym()"); } if (!*settings->libretro) { RARCH_ERR("RetroArch is built for dynamic libretro cores, but libretro_path is not set. Cannot continue.\n"); rarch_fail(1, "init_libretro_sym()"); } /* Need to use absolute path for this setting. It can be * saved to content history, and a relative path would * break in that scenario. */ path_resolve_realpath(settings->libretro, sizeof(settings->libretro)); RARCH_LOG("Loading dynamic libretro core from: \"%s\"\n", settings->libretro); lib_handle = dylib_load(settings->libretro); if (!lib_handle) { RARCH_ERR("Failed to open libretro core: \"%s\"\n", settings->libretro); rarch_fail(1, "load_dynamic()"); } #endif } SYM(retro_init); SYM(retro_deinit); SYM(retro_api_version); SYM(retro_get_system_info); SYM(retro_get_system_av_info); SYM(retro_set_environment); SYM(retro_set_video_refresh); SYM(retro_set_audio_sample); SYM(retro_set_audio_sample_batch); SYM(retro_set_input_poll); SYM(retro_set_input_state); SYM(retro_set_controller_port_device); SYM(retro_reset); SYM(retro_run); SYM(retro_serialize_size); SYM(retro_serialize); SYM(retro_unserialize); SYM(retro_cheat_reset); SYM(retro_cheat_set); SYM(retro_load_game); SYM(retro_load_game_special); SYM(retro_unload_game); SYM(retro_get_region); SYM(retro_get_memory_data); SYM(retro_get_memory_size); break; case CORE_TYPE_DUMMY: SYM_DUMMY(retro_init); SYM_DUMMY(retro_deinit); SYM_DUMMY(retro_api_version); SYM_DUMMY(retro_get_system_info); SYM_DUMMY(retro_get_system_av_info); SYM_DUMMY(retro_set_environment); SYM_DUMMY(retro_set_video_refresh); SYM_DUMMY(retro_set_audio_sample); SYM_DUMMY(retro_set_audio_sample_batch); SYM_DUMMY(retro_set_input_poll); SYM_DUMMY(retro_set_input_state); SYM_DUMMY(retro_set_controller_port_device); SYM_DUMMY(retro_reset); SYM_DUMMY(retro_run); SYM_DUMMY(retro_serialize_size); SYM_DUMMY(retro_serialize); SYM_DUMMY(retro_unserialize); SYM_DUMMY(retro_cheat_reset); SYM_DUMMY(retro_cheat_set); SYM_DUMMY(retro_load_game); SYM_DUMMY(retro_load_game_special); SYM_DUMMY(retro_unload_game); SYM_DUMMY(retro_get_region); SYM_DUMMY(retro_get_memory_data); SYM_DUMMY(retro_get_memory_size); break; #ifdef HAVE_FFMPEG case CORE_TYPE_FFMPEG: SYM_FFMPEG(retro_init); SYM_FFMPEG(retro_deinit); SYM_FFMPEG(retro_api_version); SYM_FFMPEG(retro_get_system_info); SYM_FFMPEG(retro_get_system_av_info); SYM_FFMPEG(retro_set_environment); SYM_FFMPEG(retro_set_video_refresh); SYM_FFMPEG(retro_set_audio_sample); SYM_FFMPEG(retro_set_audio_sample_batch); SYM_FFMPEG(retro_set_input_poll); SYM_FFMPEG(retro_set_input_state); SYM_FFMPEG(retro_set_controller_port_device); SYM_FFMPEG(retro_reset); SYM_FFMPEG(retro_run); SYM_FFMPEG(retro_serialize_size); SYM_FFMPEG(retro_serialize); SYM_FFMPEG(retro_unserialize); SYM_FFMPEG(retro_cheat_reset); SYM_FFMPEG(retro_cheat_set); SYM_FFMPEG(retro_load_game); SYM_FFMPEG(retro_load_game_special); SYM_FFMPEG(retro_unload_game); SYM_FFMPEG(retro_get_region); SYM_FFMPEG(retro_get_memory_data); SYM_FFMPEG(retro_get_memory_size); break; #endif case CORE_TYPE_IMAGEVIEWER: #ifdef HAVE_IMAGEVIEWER SYM_IMAGEVIEWER(retro_init); SYM_IMAGEVIEWER(retro_deinit); SYM_IMAGEVIEWER(retro_api_version); SYM_IMAGEVIEWER(retro_get_system_info); SYM_IMAGEVIEWER(retro_get_system_av_info); SYM_IMAGEVIEWER(retro_set_environment); SYM_IMAGEVIEWER(retro_set_video_refresh); SYM_IMAGEVIEWER(retro_set_audio_sample); SYM_IMAGEVIEWER(retro_set_audio_sample_batch); SYM_IMAGEVIEWER(retro_set_input_poll); SYM_IMAGEVIEWER(retro_set_input_state); SYM_IMAGEVIEWER(retro_set_controller_port_device); SYM_IMAGEVIEWER(retro_reset); SYM_IMAGEVIEWER(retro_run); SYM_IMAGEVIEWER(retro_serialize_size); SYM_IMAGEVIEWER(retro_serialize); SYM_IMAGEVIEWER(retro_unserialize); SYM_IMAGEVIEWER(retro_cheat_reset); SYM_IMAGEVIEWER(retro_cheat_set); SYM_IMAGEVIEWER(retro_load_game); SYM_IMAGEVIEWER(retro_load_game_special); SYM_IMAGEVIEWER(retro_unload_game); SYM_IMAGEVIEWER(retro_get_region); SYM_IMAGEVIEWER(retro_get_memory_data); SYM_IMAGEVIEWER(retro_get_memory_size); #endif break; } }