diff options
Diffstat (limited to 'platform/linuxbsd')
| -rw-r--r-- | platform/linuxbsd/export/export.cpp | 108 | ||||
| -rw-r--r-- | platform/linuxbsd/export/export_plugin.cpp | 126 | ||||
| -rw-r--r-- | platform/linuxbsd/export/export_plugin.h | 4 | 
3 files changed, 130 insertions, 108 deletions
diff --git a/platform/linuxbsd/export/export.cpp b/platform/linuxbsd/export/export.cpp index 796e82594a..e5caff2860 100644 --- a/platform/linuxbsd/export/export.cpp +++ b/platform/linuxbsd/export/export.cpp @@ -32,8 +32,6 @@  #include "export_plugin.h" -static Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size); -  void register_linuxbsd_exporter() {  	Ref<EditorExportPlatformLinuxBSD> platform;  	platform.instantiate(); @@ -52,112 +50,6 @@ void register_linuxbsd_exporter() {  	platform->set_debug_64("linux_x11_64_debug");  	platform->set_os_name("LinuxBSD");  	platform->set_chmod_flags(0755); -	platform->set_fixup_embedded_pck_func(&fixup_embedded_pck);  	EditorExport::get_singleton()->add_export_platform(platform);  } - -static Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size) { -	// Patch the header of the "pck" section in the ELF file so that it corresponds to the embedded data - -	FileAccess *f = FileAccess::open(p_path, FileAccess::READ_WRITE); -	if (!f) { -		return ERR_CANT_OPEN; -	} - -	// Read and check ELF magic number -	{ -		uint32_t magic = f->get_32(); -		if (magic != 0x464c457f) { // 0x7F + "ELF" -			f->close(); -			return ERR_FILE_CORRUPT; -		} -	} - -	// Read program architecture bits from class field - -	int bits = f->get_8() * 32; - -	if (bits == 32 && p_embedded_size >= 0x100000000) { -		f->close(); -		ERR_FAIL_V_MSG(ERR_INVALID_DATA, "32-bit executables cannot have embedded data >= 4 GiB."); -	} - -	// Get info about the section header table - -	int64_t section_table_pos; -	int64_t section_header_size; -	if (bits == 32) { -		section_header_size = 40; -		f->seek(0x20); -		section_table_pos = f->get_32(); -		f->seek(0x30); -	} else { // 64 -		section_header_size = 64; -		f->seek(0x28); -		section_table_pos = f->get_64(); -		f->seek(0x3c); -	} -	int num_sections = f->get_16(); -	int string_section_idx = f->get_16(); - -	// Load the strings table -	uint8_t *strings; -	{ -		// Jump to the strings section header -		f->seek(section_table_pos + string_section_idx * section_header_size); - -		// Read strings data size and offset -		int64_t string_data_pos; -		int64_t string_data_size; -		if (bits == 32) { -			f->seek(f->get_position() + 0x10); -			string_data_pos = f->get_32(); -			string_data_size = f->get_32(); -		} else { // 64 -			f->seek(f->get_position() + 0x18); -			string_data_pos = f->get_64(); -			string_data_size = f->get_64(); -		} - -		// Read strings data -		f->seek(string_data_pos); -		strings = (uint8_t *)memalloc(string_data_size); -		if (!strings) { -			f->close(); -			return ERR_OUT_OF_MEMORY; -		} -		f->get_buffer(strings, string_data_size); -	} - -	// Search for the "pck" section - -	bool found = false; -	for (int i = 0; i < num_sections; ++i) { -		int64_t section_header_pos = section_table_pos + i * section_header_size; -		f->seek(section_header_pos); - -		uint32_t name_offset = f->get_32(); -		if (strcmp((char *)strings + name_offset, "pck") == 0) { -			// "pck" section found, let's patch! - -			if (bits == 32) { -				f->seek(section_header_pos + 0x10); -				f->store_32(p_embedded_start); -				f->store_32(p_embedded_size); -			} else { // 64 -				f->seek(section_header_pos + 0x18); -				f->store_64(p_embedded_start); -				f->store_64(p_embedded_size); -			} - -			found = true; -			break; -		} -	} - -	memfree(strings); -	f->close(); - -	return found ? OK : ERR_FILE_CORRUPT; -} diff --git a/platform/linuxbsd/export/export_plugin.cpp b/platform/linuxbsd/export/export_plugin.cpp index 99f5b82b34..08fc9c0452 100644 --- a/platform/linuxbsd/export/export_plugin.cpp +++ b/platform/linuxbsd/export/export_plugin.cpp @@ -72,3 +72,129 @@ Error EditorExportPlatformLinuxBSD::export_project(const Ref<EditorExportPreset>  	return err;  } + +void EditorExportPlatformLinuxBSD::set_extension(const String &p_extension, const String &p_feature_key) { +	extensions[p_feature_key] = p_extension; +} + +List<String> EditorExportPlatformLinuxBSD::get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const { +	List<String> list; +	for (const KeyValue<String, String> &E : extensions) { +		if (p_preset->get(E.key)) { +			list.push_back(extensions[E.key]); +			return list; +		} +	} + +	if (extensions.has("default")) { +		list.push_back(extensions["default"]); +		return list; +	} + +	return list; +} + +Error EditorExportPlatformLinuxBSD::fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size) const { +	// Patch the header of the "pck" section in the ELF file so that it corresponds to the embedded data + +	FileAccess *f = FileAccess::open(p_path, FileAccess::READ_WRITE); +	if (!f) { +		return ERR_CANT_OPEN; +	} + +	// Read and check ELF magic number +	{ +		uint32_t magic = f->get_32(); +		if (magic != 0x464c457f) { // 0x7F + "ELF" +			f->close(); +			return ERR_FILE_CORRUPT; +		} +	} + +	// Read program architecture bits from class field + +	int bits = f->get_8() * 32; + +	if (bits == 32 && p_embedded_size >= 0x100000000) { +		f->close(); +		ERR_FAIL_V_MSG(ERR_INVALID_DATA, "32-bit executables cannot have embedded data >= 4 GiB."); +	} + +	// Get info about the section header table + +	int64_t section_table_pos; +	int64_t section_header_size; +	if (bits == 32) { +		section_header_size = 40; +		f->seek(0x20); +		section_table_pos = f->get_32(); +		f->seek(0x30); +	} else { // 64 +		section_header_size = 64; +		f->seek(0x28); +		section_table_pos = f->get_64(); +		f->seek(0x3c); +	} +	int num_sections = f->get_16(); +	int string_section_idx = f->get_16(); + +	// Load the strings table +	uint8_t *strings; +	{ +		// Jump to the strings section header +		f->seek(section_table_pos + string_section_idx * section_header_size); + +		// Read strings data size and offset +		int64_t string_data_pos; +		int64_t string_data_size; +		if (bits == 32) { +			f->seek(f->get_position() + 0x10); +			string_data_pos = f->get_32(); +			string_data_size = f->get_32(); +		} else { // 64 +			f->seek(f->get_position() + 0x18); +			string_data_pos = f->get_64(); +			string_data_size = f->get_64(); +		} + +		// Read strings data +		f->seek(string_data_pos); +		strings = (uint8_t *)memalloc(string_data_size); +		if (!strings) { +			f->close(); +			return ERR_OUT_OF_MEMORY; +		} +		f->get_buffer(strings, string_data_size); +	} + +	// Search for the "pck" section + +	bool found = false; +	for (int i = 0; i < num_sections; ++i) { +		int64_t section_header_pos = section_table_pos + i * section_header_size; +		f->seek(section_header_pos); + +		uint32_t name_offset = f->get_32(); +		if (strcmp((char *)strings + name_offset, "pck") == 0) { +			// "pck" section found, let's patch! + +			if (bits == 32) { +				f->seek(section_header_pos + 0x10); +				f->store_32(p_embedded_start); +				f->store_32(p_embedded_size); +			} else { // 64 +				f->seek(section_header_pos + 0x18); +				f->store_64(p_embedded_start); +				f->store_64(p_embedded_size); +			} + +			found = true; +			break; +		} +	} + +	memfree(strings); +	f->close(); + +	return found ? OK : ERR_FILE_CORRUPT; +} diff --git a/platform/linuxbsd/export/export_plugin.h b/platform/linuxbsd/export/export_plugin.h index f482ddce3d..593916e586 100644 --- a/platform/linuxbsd/export/export_plugin.h +++ b/platform/linuxbsd/export/export_plugin.h @@ -38,10 +38,14 @@  #include "scene/resources/texture.h"  class EditorExportPlatformLinuxBSD : public EditorExportPlatformPC { +	Map<String, String> extensions;  	Error _export_debug_script(const Ref<EditorExportPreset> &p_preset, const String &p_app_name, const String &p_pkg_name, const String &p_path);  public: +	void set_extension(const String &p_extension, const String &p_feature_key = "default"); +	virtual List<String> get_binary_extensions(const Ref<EditorExportPreset> &p_preset) const override;  	virtual Error export_project(const Ref<EditorExportPreset> &p_preset, bool p_debug, const String &p_path, int p_flags = 0) override; +	virtual Error fixup_embedded_pck(const String &p_path, int64_t p_embedded_start, int64_t p_embedded_size) const override;  };  #endif  |