From 6380852f898c774897b6cfa74f0eaef3c0ca6b67 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Wed, 26 Oct 2016 12:46:26 -0700 Subject: [coff_file_reader] Improve error message --- toolsrc/src/coff_file_reader.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 593bb18d1..f46150979 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -34,9 +34,9 @@ namespace vcpkg {namespace COFFFileReader return data; } - static void verify_equal_strings(const char* expected, const char* actual, int size) + static void verify_equal_strings(const char* expected, const char* actual, int size, const char* label) { - Checks::check_exit(memcmp(expected, actual, size) == 0, "Incorrect string found. Expected: %s but found %s", expected, actual); + Checks::check_exit(memcmp(expected, actual, size) == 0, "Incorrect string (%s) found. Expected: %s but found %s", label, expected, actual); } static void read_and_verify_PE_signature(fstream& fs) @@ -52,7 +52,7 @@ namespace vcpkg {namespace COFFFileReader fs.seekg(offset_to_PE_signature); char signature[PE_SIGNATURE_SIZE]; fs.read(signature, PE_SIGNATURE_SIZE); - verify_equal_strings(PE_SIGNATURE, signature, PE_SIGNATURE_SIZE); + verify_equal_strings(PE_SIGNATURE, signature, PE_SIGNATURE_SIZE, "PE_SIGNATURE"); fs.seekg(offset_to_PE_signature + PE_SIGNATURE_SIZE, ios_base::beg); } @@ -114,7 +114,7 @@ namespace vcpkg {namespace COFFFileReader fs.read(&ret.data[0], HEADER_SIZE); const std::string header_end = ret.data.substr(HEADER_END_OFFSET, HEADER_END_SIZE); - verify_equal_strings(HEADER_END, header_end.c_str(), HEADER_END_SIZE); + verify_equal_strings(HEADER_END, header_end.c_str(), HEADER_END_SIZE, "LIB HEADER_END"); return ret; } @@ -207,7 +207,7 @@ namespace vcpkg {namespace COFFFileReader char file_start[FILE_START_SIZE]; fs.read(file_start, FILE_START_SIZE); - verify_equal_strings(FILE_START, file_start, FILE_START_SIZE); + verify_equal_strings(FILE_START, file_start, FILE_START_SIZE, "LIB FILE_START"); } dll_info read_dll(const fs::path path) -- cgit v1.2.3 From a882cfe14f28979e453e92786b1a3ff82a28904b Mon Sep 17 00:00:00 2001 From: Geert Van Laethem Date: Tue, 15 Nov 2016 15:26:16 +0100 Subject: possible fix for issue #223 --- toolsrc/src/coff_file_reader.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index f46150979..0b14abcc8 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -8,7 +8,7 @@ using namespace std; -namespace vcpkg {namespace COFFFileReader +namespace vcpkg { namespace COFFFileReader { template static T reinterpret_bytes(const char* data) @@ -36,7 +36,7 @@ namespace vcpkg {namespace COFFFileReader static void verify_equal_strings(const char* expected, const char* actual, int size, const char* label) { - Checks::check_exit(memcmp(expected, actual, size) == 0, "Incorrect string (%s) found. Expected: %s but found %s", label, expected, actual); + Checks::check_exit(memcmp(expected, actual, size) == 0, "Incorrect string (%s) found. Expected: (%s) but found (%s)", label, expected, actual); } static void read_and_verify_PE_signature(fstream& fs) @@ -113,8 +113,11 @@ namespace vcpkg {namespace COFFFileReader ret.data.resize(HEADER_SIZE); fs.read(&ret.data[0], HEADER_SIZE); - const std::string header_end = ret.data.substr(HEADER_END_OFFSET, HEADER_END_SIZE); - verify_equal_strings(HEADER_END, header_end.c_str(), HEADER_END_SIZE, "LIB HEADER_END"); + if (ret.data[0] != '\0') + { + const std::string header_end = ret.data.substr(HEADER_END_OFFSET, HEADER_END_SIZE); + verify_equal_strings(HEADER_END, header_end.c_str(), HEADER_END_SIZE, "LIB HEADER_END"); + } return ret; } @@ -251,10 +254,13 @@ namespace vcpkg {namespace COFFFileReader for (uint32_t i = 0; i < archive_member_count; i++) { const archive_member_header header = archive_member_header::read(fs); - const uint16_t first_two_bytes = peek_value_from_stream(fs); - const bool isImportHeader = getMachineType(first_two_bytes) == MachineType::UNKNOWN; - const MachineType machine = isImportHeader ? import_header::peek(fs).machineType() : coff_file_header::peek(fs).machineType(); - machine_types.insert(machine); + if (header.data[0] != '\0') + { + const uint16_t first_two_bytes = peek_value_from_stream(fs); + const bool isImportHeader = getMachineType(first_two_bytes) == MachineType::UNKNOWN; + const MachineType machine = isImportHeader ? import_header::peek(fs).machineType() : coff_file_header::peek(fs).machineType(); + machine_types.insert(machine); + } skip_archive_member(fs, header.member_size()); } -- cgit v1.2.3 From 45dbe92e9be6683a23e954a0106f54645377c191 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 15 Nov 2016 17:06:00 -0800 Subject: Add comment about freeglut in coff_file_reader.cpp --- toolsrc/src/coff_file_reader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 0b14abcc8..5a53dcae6 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -113,7 +113,7 @@ namespace vcpkg { namespace COFFFileReader ret.data.resize(HEADER_SIZE); fs.read(&ret.data[0], HEADER_SIZE); - if (ret.data[0] != '\0') + if (ret.data[0] != '\0') // Due to freeglut. github issue #223 { const std::string header_end = ret.data.substr(HEADER_END_OFFSET, HEADER_END_SIZE); verify_equal_strings(HEADER_END, header_end.c_str(), HEADER_END_SIZE, "LIB HEADER_END"); @@ -254,7 +254,7 @@ namespace vcpkg { namespace COFFFileReader for (uint32_t i = 0; i < archive_member_count; i++) { const archive_member_header header = archive_member_header::read(fs); - if (header.data[0] != '\0') + if (header.data[0] != '\0') // Due to freeglut. github issue #223 { const uint16_t first_two_bytes = peek_value_from_stream(fs); const bool isImportHeader = getMachineType(first_two_bytes) == MachineType::UNKNOWN; -- cgit v1.2.3 From e969c5c8eb2429436de35eab3cbe34133566a380 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Tue, 15 Nov 2016 17:41:31 -0800 Subject: Remove unused #includes --- toolsrc/src/coff_file_reader.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 5a53dcae6..db8524faa 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -1,7 +1,5 @@ #include "coff_file_reader.h" #include -#include -#include #include "vcpkg_Checks.h" #include #include -- cgit v1.2.3 From a9223bd8df10483c9e5497c55c99fdf26cd2a6c2 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 17 Nov 2016 15:20:18 -0800 Subject: [coff] Variable rename --- toolsrc/src/coff_file_reader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index db8524faa..c6bfc33d2 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -195,8 +195,8 @@ namespace vcpkg { namespace COFFFileReader { static const size_t ALIGNMENT_SIZE = 2; - const fpos_t new_offset = align_to(member_size, ALIGNMENT_SIZE); - fs.seekg(new_offset, ios_base::cur); + const fpos_t advance_by = align_to(member_size, ALIGNMENT_SIZE); + fs.seekg(advance_by, ios_base::cur); } static void read_and_verify_archive_file_signature(fstream& fs) -- cgit v1.2.3 From 6c2ce4981f7e463c8187aa62c461da564977cea3 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 17 Nov 2016 15:21:22 -0800 Subject: [coff] Function rename --- toolsrc/src/coff_file_reader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index c6bfc33d2..5dd32bcd5 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -54,7 +54,7 @@ namespace vcpkg { namespace COFFFileReader fs.seekg(offset_to_PE_signature + PE_SIGNATURE_SIZE, ios_base::beg); } - static fpos_t align_to(const fpos_t unaligned_offset, const int alignment_size) + static fpos_t align_offset_to_size(const fpos_t unaligned_offset, const int alignment_size) { fpos_t aligned_offset = unaligned_offset - 1; aligned_offset /= alignment_size; @@ -195,7 +195,7 @@ namespace vcpkg { namespace COFFFileReader { static const size_t ALIGNMENT_SIZE = 2; - const fpos_t advance_by = align_to(member_size, ALIGNMENT_SIZE); + const fpos_t advance_by = align_offset_to_size(member_size, ALIGNMENT_SIZE); fs.seekg(advance_by, ios_base::cur); } -- cgit v1.2.3 From 9ab1ea53313b7db5c6fc695643dc896b294238c9 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 17 Nov 2016 15:43:47 -0800 Subject: [coff] member_size() now returns already aligned size --- toolsrc/src/coff_file_reader.cpp | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 5dd32bcd5..1766cf8e9 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -54,13 +54,13 @@ namespace vcpkg { namespace COFFFileReader fs.seekg(offset_to_PE_signature + PE_SIGNATURE_SIZE, ios_base::beg); } - static fpos_t align_offset_to_size(const fpos_t unaligned_offset, const int alignment_size) + static fpos_t align_to_size(const uint64_t unaligned, const uint64_t alignment_size) { - fpos_t aligned_offset = unaligned_offset - 1; - aligned_offset /= alignment_size; - aligned_offset += 1; - aligned_offset *= alignment_size; - return aligned_offset; + fpos_t aligned = unaligned - 1; + aligned /= alignment_size; + aligned += 1; + aligned *= alignment_size; + return aligned; } struct coff_file_header @@ -129,12 +129,16 @@ namespace vcpkg { namespace COFFFileReader uint64_t member_size() const { + static const size_t ALIGNMENT_SIZE = 2; + static const size_t HEADER_SIZE_OFFSET = 48; static const size_t HEADER_SIZE_FIELD_SIZE = 10; const std::string as_string = data.substr(HEADER_SIZE_OFFSET, HEADER_SIZE_FIELD_SIZE); // This is in ASCII decimal representation const uint64_t value = std::strtoull(as_string.c_str(), nullptr, 10); - return value; + + const uint64_t aligned = align_to_size(value, ALIGNMENT_SIZE); + return aligned; } std::string data; @@ -191,14 +195,6 @@ namespace vcpkg { namespace COFFFileReader std::string data; }; - static void skip_archive_member(fstream& fs, uint64_t member_size) - { - static const size_t ALIGNMENT_SIZE = 2; - - const fpos_t advance_by = align_offset_to_size(member_size, ALIGNMENT_SIZE); - fs.seekg(advance_by, ios_base::cur); - } - static void read_and_verify_archive_file_signature(fstream& fs) { static const char* FILE_START = "!\n"; @@ -232,19 +228,19 @@ namespace vcpkg { namespace COFFFileReader // First Linker Member const archive_member_header first_linker_member_header = archive_member_header::read(fs); Checks::check_exit(first_linker_member_header.name().substr(0, 2) == "/ ", "Could not find proper first linker member"); - skip_archive_member(fs, first_linker_member_header.member_size()); + fs.seekg(first_linker_member_header.member_size(), ios_base::cur); const archive_member_header second_linker_member_header = archive_member_header::read(fs); Checks::check_exit(second_linker_member_header.name().substr(0, 2) == "/ ", "Could not find proper second linker member"); // The first 4 bytes contains the number of archive members const uint32_t archive_member_count = peek_value_from_stream(fs); - skip_archive_member(fs, second_linker_member_header.member_size()); + fs.seekg(second_linker_member_header.member_size(), ios_base::cur); bool hasLongnameMemberHeader = peek_value_from_stream(fs) == 0x2F2F; if (hasLongnameMemberHeader) { const archive_member_header longnames_member_header = archive_member_header::read(fs); - skip_archive_member(fs, longnames_member_header.member_size()); + fs.seekg(longnames_member_header.member_size(), ios_base::cur); } std::set machine_types; @@ -259,7 +255,7 @@ namespace vcpkg { namespace COFFFileReader const MachineType machine = isImportHeader ? import_header::peek(fs).machineType() : coff_file_header::peek(fs).machineType(); machine_types.insert(machine); } - skip_archive_member(fs, header.member_size()); + fs.seekg(header.member_size(), ios_base::cur); } return {std::vector(machine_types.cbegin(), machine_types.cend())}; -- cgit v1.2.3 From f0ef09c3fcd78936b8219a7530f17b21911cc8cd Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 17 Nov 2016 16:19:46 -0800 Subject: [coff] Introduce marker_t. Eliminate one of the peek functions --- toolsrc/src/coff_file_reader.cpp | 51 ++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 15 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 1766cf8e9..9ea79bf99 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -173,14 +173,6 @@ namespace vcpkg { namespace COFFFileReader return ret; } - static import_header peek(fstream& fs) - { - auto original_pos = fs.tellg().seekpos(); - import_header ret = read(fs); - fs.seekg(original_pos); - return ret; - } - MachineType machineType() const { static const size_t MACHINE_TYPE_OFFSET = 6; @@ -218,6 +210,27 @@ namespace vcpkg { namespace COFFFileReader return {machine}; } + struct marker_t + { + void set_to_current_pos(fstream& fs) + { + this->m_absolute_position = fs.tellg().seekpos(); + } + + void seek_to_marker(fstream& fs) const + { + fs.seekg(this->m_absolute_position, ios_base::beg); + } + + void advance_by(const uint64_t offset) + { + this->m_absolute_position += offset; + } + + private: + fpos_t m_absolute_position = 0; + }; + lib_info read_lib(const fs::path path) { std::fstream fs(path, std::ios::in | std::ios::binary | std::ios::ate); @@ -225,23 +238,30 @@ namespace vcpkg { namespace COFFFileReader read_and_verify_archive_file_signature(fs); + marker_t marker; + marker.set_to_current_pos(fs); + // First Linker Member const archive_member_header first_linker_member_header = archive_member_header::read(fs); Checks::check_exit(first_linker_member_header.name().substr(0, 2) == "/ ", "Could not find proper first linker member"); - fs.seekg(first_linker_member_header.member_size(), ios_base::cur); + marker.advance_by(archive_member_header::HEADER_SIZE + first_linker_member_header.member_size()); + marker.seek_to_marker(fs); const archive_member_header second_linker_member_header = archive_member_header::read(fs); Checks::check_exit(second_linker_member_header.name().substr(0, 2) == "/ ", "Could not find proper second linker member"); // The first 4 bytes contains the number of archive members - const uint32_t archive_member_count = peek_value_from_stream(fs); - fs.seekg(second_linker_member_header.member_size(), ios_base::cur); + const uint32_t archive_member_count = read_value_from_stream(fs); + marker.advance_by(archive_member_header::HEADER_SIZE + second_linker_member_header.member_size()); + marker.seek_to_marker(fs); - bool hasLongnameMemberHeader = peek_value_from_stream(fs) == 0x2F2F; + bool hasLongnameMemberHeader = read_value_from_stream(fs) == 0x2F2F; if (hasLongnameMemberHeader) { + marker.seek_to_marker(fs); const archive_member_header longnames_member_header = archive_member_header::read(fs); - fs.seekg(longnames_member_header.member_size(), ios_base::cur); + marker.advance_by(archive_member_header::HEADER_SIZE + longnames_member_header.member_size()); } + marker.seek_to_marker(fs); std::set machine_types; // Next we have the obj and pseudo-object files @@ -252,10 +272,11 @@ namespace vcpkg { namespace COFFFileReader { const uint16_t first_two_bytes = peek_value_from_stream(fs); const bool isImportHeader = getMachineType(first_two_bytes) == MachineType::UNKNOWN; - const MachineType machine = isImportHeader ? import_header::peek(fs).machineType() : coff_file_header::peek(fs).machineType(); + const MachineType machine = isImportHeader ? import_header::read(fs).machineType() : coff_file_header::peek(fs).machineType(); machine_types.insert(machine); } - fs.seekg(header.member_size(), ios_base::cur); + marker.advance_by(archive_member_header::HEADER_SIZE + header.member_size()); + marker.seek_to_marker(fs); } return {std::vector(machine_types.cbegin(), machine_types.cend())}; -- cgit v1.2.3 From c6ac0e5ca74a719a6990f6bba5002883900ad85c Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 17 Nov 2016 16:22:22 -0800 Subject: [coff] Eliminate another peek() function --- toolsrc/src/coff_file_reader.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 9ea79bf99..6a2a57159 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -75,14 +75,6 @@ namespace vcpkg { namespace COFFFileReader return ret; } - static coff_file_header peek(fstream& fs) - { - auto original_pos = fs.tellg().seekpos(); - coff_file_header ret = read(fs); - fs.seekg(original_pos); - return ret; - } - MachineType machineType() const { static const size_t MACHINE_TYPE_OFFSET = 0; @@ -272,7 +264,7 @@ namespace vcpkg { namespace COFFFileReader { const uint16_t first_two_bytes = peek_value_from_stream(fs); const bool isImportHeader = getMachineType(first_two_bytes) == MachineType::UNKNOWN; - const MachineType machine = isImportHeader ? import_header::read(fs).machineType() : coff_file_header::peek(fs).machineType(); + const MachineType machine = isImportHeader ? import_header::read(fs).machineType() : coff_file_header::read(fs).machineType(); machine_types.insert(machine); } marker.advance_by(archive_member_header::HEADER_SIZE + header.member_size()); -- cgit v1.2.3 From 7805de1a5686f192bc4b174f3a98098505788d5b Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 17 Nov 2016 16:28:09 -0800 Subject: [coff] Use peek_value() --- toolsrc/src/coff_file_reader.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 6a2a57159..763443e6e 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -246,14 +246,13 @@ namespace vcpkg { namespace COFFFileReader marker.advance_by(archive_member_header::HEADER_SIZE + second_linker_member_header.member_size()); marker.seek_to_marker(fs); - bool hasLongnameMemberHeader = read_value_from_stream(fs) == 0x2F2F; + bool hasLongnameMemberHeader = peek_value_from_stream(fs) == 0x2F2F; if (hasLongnameMemberHeader) { - marker.seek_to_marker(fs); const archive_member_header longnames_member_header = archive_member_header::read(fs); marker.advance_by(archive_member_header::HEADER_SIZE + longnames_member_header.member_size()); + marker.seek_to_marker(fs); } - marker.seek_to_marker(fs); std::set machine_types; // Next we have the obj and pseudo-object files -- cgit v1.2.3 From ba28195eb8ead2724400c6d0cdf123dbfadadffb Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 17 Nov 2016 17:36:30 -0800 Subject: [coff] Read the second linker offsets to deduce the real offset count Those that start with 0 are ignored --- toolsrc/src/coff_file_reader.cpp | 46 +++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 8 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 763443e6e..e8bb6089c 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -136,6 +136,38 @@ namespace vcpkg { namespace COFFFileReader std::string data; }; + struct offsets_array + { + static offsets_array read(fstream& fs, const uint32_t offset_count) + { + static const size_t OFFSET_WIDTH = 4; + + std::string raw_offsets; + const size_t raw_offset_size = offset_count * OFFSET_WIDTH; + raw_offsets.resize(raw_offset_size); + fs.read(&raw_offsets[0], raw_offset_size); + + offsets_array ret; + for (uint32_t i = 0; i < offset_count; ++i) + { + const std::string value_as_string = raw_offsets.substr(OFFSET_WIDTH * i, OFFSET_WIDTH * (i + 1)); + const uint32_t value = reinterpret_bytes(value_as_string.c_str()); + + // Ignore offsets that point to offset 0. See vcpkg github #223 #288 #292 + if (value != 0) + { + ret.data.push_back(value); + } + } + + // Sort the offsets, because it is possible for them to be unsorted. See vcpkg github #292 + std::sort(ret.data.begin(), ret.data.end()); + return ret; + } + + std::vector data; + }; + struct import_header { static const size_t HEADER_SIZE = 20; @@ -243,6 +275,7 @@ namespace vcpkg { namespace COFFFileReader Checks::check_exit(second_linker_member_header.name().substr(0, 2) == "/ ", "Could not find proper second linker member"); // The first 4 bytes contains the number of archive members const uint32_t archive_member_count = read_value_from_stream(fs); + const offsets_array offsets = offsets_array::read(fs, archive_member_count); marker.advance_by(archive_member_header::HEADER_SIZE + second_linker_member_header.member_size()); marker.seek_to_marker(fs); @@ -256,16 +289,13 @@ namespace vcpkg { namespace COFFFileReader std::set machine_types; // Next we have the obj and pseudo-object files - for (uint32_t i = 0; i < archive_member_count; i++) + for (uint32_t i = 0; i < offsets.data.size(); i++) { const archive_member_header header = archive_member_header::read(fs); - if (header.data[0] != '\0') // Due to freeglut. github issue #223 - { - const uint16_t first_two_bytes = peek_value_from_stream(fs); - const bool isImportHeader = getMachineType(first_two_bytes) == MachineType::UNKNOWN; - const MachineType machine = isImportHeader ? import_header::read(fs).machineType() : coff_file_header::read(fs).machineType(); - machine_types.insert(machine); - } + const uint16_t first_two_bytes = peek_value_from_stream(fs); + const bool isImportHeader = getMachineType(first_two_bytes) == MachineType::UNKNOWN; + const MachineType machine = isImportHeader ? import_header::read(fs).machineType() : coff_file_header::read(fs).machineType(); + machine_types.insert(machine); marker.advance_by(archive_member_header::HEADER_SIZE + header.member_size()); marker.seek_to_marker(fs); } -- cgit v1.2.3 From 26a8ed58becf42c2c448aa9ee7621ed2c26319fc Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 18 Nov 2016 13:36:45 -0800 Subject: [coff] Use the offsets_array to go to archive members. Fixes #292 --- toolsrc/src/coff_file_reader.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index e8bb6089c..3bf7922f5 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -236,6 +236,11 @@ namespace vcpkg { namespace COFFFileReader struct marker_t { + void set_to_offset(const fpos_t position) + { + this->m_absolute_position = position; + } + void set_to_current_pos(fstream& fs) { this->m_absolute_position = fs.tellg().seekpos(); @@ -289,15 +294,14 @@ namespace vcpkg { namespace COFFFileReader std::set machine_types; // Next we have the obj and pseudo-object files - for (uint32_t i = 0; i < offsets.data.size(); i++) + for (const uint32_t offset : offsets.data) { - const archive_member_header header = archive_member_header::read(fs); + marker.set_to_offset(offset + archive_member_header::HEADER_SIZE); // Skip the header, no need to read it. + marker.seek_to_marker(fs); const uint16_t first_two_bytes = peek_value_from_stream(fs); const bool isImportHeader = getMachineType(first_two_bytes) == MachineType::UNKNOWN; const MachineType machine = isImportHeader ? import_header::read(fs).machineType() : coff_file_header::read(fs).machineType(); machine_types.insert(machine); - marker.advance_by(archive_member_header::HEADER_SIZE + header.member_size()); - marker.seek_to_marker(fs); } return {std::vector(machine_types.cbegin(), machine_types.cend())}; -- cgit v1.2.3 From 73bf8306b29d68853dc3c97d5dd415bd5e857cf5 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 16 Dec 2016 20:11:50 -0800 Subject: Pass by const ref --- toolsrc/src/coff_file_reader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 3bf7922f5..1f30ea70b 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -223,7 +223,7 @@ namespace vcpkg { namespace COFFFileReader verify_equal_strings(FILE_START, file_start, FILE_START_SIZE, "LIB FILE_START"); } - dll_info read_dll(const fs::path path) + dll_info read_dll(const fs::path& path) { std::fstream fs(path, std::ios::in | std::ios::binary | std::ios::ate); Checks::check_exit(fs.is_open(), "Could not open file %s for reading", path.generic_string()); @@ -260,7 +260,7 @@ namespace vcpkg { namespace COFFFileReader fpos_t m_absolute_position = 0; }; - lib_info read_lib(const fs::path path) + lib_info read_lib(const fs::path& path) { std::fstream fs(path, std::ios::in | std::ios::binary | std::ios::ate); Checks::check_exit(fs.is_open(), "Could not open file %s for reading", path.generic_string()); -- cgit v1.2.3 From 88b5791b0bcaa9cce7f488bbd03042aa65e4417e Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Thu, 5 Jan 2017 14:14:11 -0800 Subject: Use Nested Namespace Definition --- toolsrc/src/coff_file_reader.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 1f30ea70b..8ce714bbe 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -6,7 +6,7 @@ using namespace std; -namespace vcpkg { namespace COFFFileReader +namespace vcpkg::COFFFileReader { template static T reinterpret_bytes(const char* data) @@ -306,4 +306,4 @@ namespace vcpkg { namespace COFFFileReader return {std::vector(machine_types.cbegin(), machine_types.cend())}; } -}} +} -- cgit v1.2.3 From 050e4a0f7a8156bd862f95c06ea298ab6697e147 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Fri, 27 Jan 2017 12:49:09 -0800 Subject: Introduce precompiled headers --- toolsrc/src/coff_file_reader.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'toolsrc/src/coff_file_reader.cpp') diff --git a/toolsrc/src/coff_file_reader.cpp b/toolsrc/src/coff_file_reader.cpp index 8ce714bbe..f48f912c1 100644 --- a/toolsrc/src/coff_file_reader.cpp +++ b/toolsrc/src/coff_file_reader.cpp @@ -1,8 +1,6 @@ +#include "pch.h" #include "coff_file_reader.h" -#include #include "vcpkg_Checks.h" -#include -#include using namespace std; -- cgit v1.2.3