object_file.cc (10880:61a56f76222b) object_file.cc (11354:414abc839464)
1/*
2 * Copyright (c) 2002-2004 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 19 unchanged lines hidden (view full) ---

28 * Authors: Nathan Binkert
29 * Steve Reinhardt
30 */
31
32#include <sys/mman.h>
33#include <sys/types.h>
34#include <fcntl.h>
35#include <unistd.h>
1/*
2 * Copyright (c) 2002-2004 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 19 unchanged lines hidden (view full) ---

28 * Authors: Nathan Binkert
29 * Steve Reinhardt
30 */
31
32#include <sys/mman.h>
33#include <sys/types.h>
34#include <fcntl.h>
35#include <unistd.h>
36#include <zlib.h>
36
37#include <cstdio>
38#include <list>
39#include <string>
40
41#include "base/loader/aout_object.hh"
42#include "base/loader/dtb_object.hh"
43#include "base/loader/ecoff_object.hh"

--- 52 unchanged lines hidden (view full) ---

96ObjectFile::close()
97{
98 if (fileData) {
99 ::munmap((char*)fileData, len);
100 fileData = NULL;
101 }
102}
103
37
38#include <cstdio>
39#include <list>
40#include <string>
41
42#include "base/loader/aout_object.hh"
43#include "base/loader/dtb_object.hh"
44#include "base/loader/ecoff_object.hh"

--- 52 unchanged lines hidden (view full) ---

97ObjectFile::close()
98{
99 if (fileData) {
100 ::munmap((char*)fileData, len);
101 fileData = NULL;
102 }
103}
104
105static bool
106hasGzipMagic(int fd)
107{
108 uint8_t buf[2] = {0};
109 size_t sz = pread(fd, buf, 2, 0);
110 panic_if(sz != 2, "Couldn't read magic bytes from object file");
111 return ((buf[0] == 0x1f) && (buf[1] == 0x8b));
112}
104
113
114static int
115doGzipLoad(int fd)
116{
117 const size_t blk_sz = 4096;
118
119 gzFile fdz = gzdopen(fd, "rb");
120 if (!fdz) {
121 return -1;
122 }
123
124 size_t tmp_len = strlen(P_tmpdir);
125 char *tmpnam = (char*) malloc(tmp_len + 20);
126 strcpy(tmpnam, P_tmpdir);
127 strcpy(tmpnam+tmp_len, "/gem5-gz-obj-XXXXXX"); // 19 chars
128 fd = mkstemp(tmpnam); // repurposing fd variable for output
129 if (fd < 0) {
130 free(tmpnam);
131 gzclose(fdz);
132 return fd;
133 }
134
135 if (unlink(tmpnam) != 0)
136 warn("couldn't remove temporary file %s\n", tmpnam);
137
138 free(tmpnam);
139
140 auto buf = new uint8_t[blk_sz];
141 int r; // size of (r)emaining uncopied data in (buf)fer
142 while ((r = gzread(fdz, buf, blk_sz)) > 0) {
143 auto p = buf; // pointer into buffer
144 while (r > 0) {
145 auto sz = write(fd, p, r);
146 assert(sz <= r);
147 r -= sz;
148 p += sz;
149 }
150 }
151 delete[] buf;
152 gzclose(fdz);
153 if (r < 0) { // error
154 close(fd);
155 return -1;
156 }
157 assert(r == 0); // finished successfully
158 return fd; // return fd to decompressed temporary file for mmap()'ing
159}
160
105ObjectFile *
106createObjectFile(const string &fname, bool raw)
107{
108 // open the file
109 int fd = open(fname.c_str(), O_RDONLY);
110 if (fd < 0) {
111 return NULL;
112 }
113
161ObjectFile *
162createObjectFile(const string &fname, bool raw)
163{
164 // open the file
165 int fd = open(fname.c_str(), O_RDONLY);
166 if (fd < 0) {
167 return NULL;
168 }
169
170 // decompress GZ files
171 if (hasGzipMagic(fd)) {
172 fd = doGzipLoad(fd);
173 if (fd < 0) {
174 return NULL;
175 }
176 }
177
114 // find the length of the file by seeking to the end
115 off_t off = lseek(fd, 0, SEEK_END);
178 // find the length of the file by seeking to the end
179 off_t off = lseek(fd, 0, SEEK_END);
116 fatal_if(off < 0, "Failed to determine size of object file %s\n", fname);
117 size_t len = static_cast<size_t>(off);
180 fatal_if(off < 0,
181 "Failed to determine size of object file %s\n", fname);
182 auto len = static_cast<size_t>(off);
118
119 // mmap the whole shebang
183
184 // mmap the whole shebang
120 uint8_t *fileData =
121 (uint8_t *)mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
185 auto fileData = (uint8_t *)mmap(NULL, len, PROT_READ, MAP_SHARED, fd, 0);
122 close(fd);
186 close(fd);
187
123 if (fileData == MAP_FAILED) {
124 return NULL;
125 }
126
127 ObjectFile *fileObj = NULL;
128
129 // figure out what we have here
130 if ((fileObj = ElfObject::tryFile(fname, len, fileData)) != NULL) {

--- 22 unchanged lines hidden ---
188 if (fileData == MAP_FAILED) {
189 return NULL;
190 }
191
192 ObjectFile *fileObj = NULL;
193
194 // figure out what we have here
195 if ((fileObj = ElfObject::tryFile(fname, len, fileData)) != NULL) {

--- 22 unchanged lines hidden ---