summaryrefslogtreecommitdiffstats
path: root/src/build/linker/linker.C
diff options
context:
space:
mode:
authorLuis Fernandez <luis.fernandez@ibm.com>2019-02-21 14:13:44 -0600
committerDaniel M. Crowell <dcrowell@us.ibm.com>2019-04-05 16:52:10 -0500
commit4995ec0ba6f15e03deb4b9ad1dc215f3f8993acb (patch)
tree35524433b3a4b268b12516cfdf2dd033688599b2 /src/build/linker/linker.C
parentc8651104f00db7538147ab4cea9c9a3a8df5e500 (diff)
downloadtalos-hostboot-4995ec0ba6f15e03deb4b9ad1dc215f3f8993acb.tar.gz
talos-hostboot-4995ec0ba6f15e03deb4b9ad1dc215f3f8993acb.zip
HB Improvements: Fix compiler warnings on modern compilers
Resolve warnings when compiling with gcc 4.8. Compiled with GCC 7.3, no more compile errors/warnings; build ends with caught exception from linker. This commit compiles with GCC 8.2, no more error/warnings; except for a linking warning. Change-Id: Ib5d7c2b5bd350edc76ee2c7de96896154cd44420 RTC: 202716 Reviewed-on: http://rchgit01.rchland.ibm.com/gerrit1/72271 Reviewed-by: Nicholas E. Bofferding <bofferdn@us.ibm.com> Reviewed-by: Ilya Smirnov <ismirno@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Diffstat (limited to 'src/build/linker/linker.C')
-rw-r--r--src/build/linker/linker.C39
1 files changed, 35 insertions, 4 deletions
diff --git a/src/build/linker/linker.C b/src/build/linker/linker.C
index 9e4751e41..a9a9d0f5e 100644
--- a/src/build/linker/linker.C
+++ b/src/build/linker/linker.C
@@ -283,6 +283,36 @@ inline void advance_to_page_align(FILE * i_f)
}
}
+/**
+ * @brief Throw error if std::fread was performed incorrectly.
+ * @param[i] i_buffer: pointer to the first object in the array to be read
+ * @param[i] i_size: size of each object in i_buffer array, in bytes
+ * @param[i] i_count: number of the objects in i_buffer array to be read
+ * @param[i] i_stream: input-file pointer
+ */
+inline void fread_wrapper(void* i_buffer, const size_t i_size,
+ const size_t i_count, FILE* i_stream)
+{
+
+ size_t n_values_read = fread(i_buffer,i_size,i_count,i_stream);
+
+ if (i_count != n_values_read)
+ {
+ if (feof(i_stream))
+ {
+ throw "End of file reached, file not read fully.";
+ }
+ else if (ferror(i_stream))
+ {
+ throw "Error occurred while reading file.";
+ }
+ else
+ {
+ throw "Unknown read error.";
+ }
+ }
+}
+
//
// Global variables
//
@@ -669,7 +699,7 @@ bool Object::write_object()
long int file_size = ftell(file);
uint8_t * buffer = new uint8_t[file_size];
fseek(file,0,SEEK_SET);
- fread(buffer,file_size,1,file);
+ fread_wrapper(buffer,file_size,1,file);
fwrite(buffer,file_size,1,iv_output);
delete [] buffer;
fclose(file);
@@ -895,7 +925,7 @@ bool Object::perform_local_relocations()
bool is_weak = false;
fseek(iv_output, offset + i->address, SEEK_SET);
- fread(data, sizeof(uint64_t), 1, iv_output);
+ fread_wrapper(data, sizeof(uint64_t), 1, iv_output);
if (weak_symbols.find(i->name) != weak_symbols.end())
{
@@ -1024,7 +1054,8 @@ bool Object::perform_global_relocations()
}
fseek(j->iv_output, symbol_addr, SEEK_SET);
- fread(data, sizeof(uint64_t), 3, j->iv_output);
+ fread_wrapper(data, sizeof(uint64_t), 3,
+ j->iv_output);
fseek(iv_output, offset + i->address, SEEK_SET);
fwrite(data, sizeof(uint64_t), 3, iv_output);
@@ -1172,7 +1203,7 @@ void ModuleTable::write_table(vector<Object> & i_objects)
cout << "Updating base module table..." << endl;
fseek(iv_output, module_table_offset, SEEK_SET);
char mx_mod_ch = 0;
- fread(&mx_mod_ch,sizeof(char),1,iv_output);
+ fread_wrapper(&mx_mod_ch,sizeof(char),1,iv_output);
max_modules = (uint64_t)mx_mod_ch; // VFS_MODULE_MAX;
++i;
}
OpenPOWER on IntegriCloud