@@ -39,6 +39,7 @@ std::map<std::string, uint32_t> loadSymbolMap(const std::string &filename)
39
39
}
40
40
41
41
void writeModuleHeader (std::vector<uint8_t > &buffer,
42
+ int version,
42
43
int id,
43
44
int sectionCount,
44
45
int sectionInfoOffset,
@@ -63,7 +64,7 @@ void writeModuleHeader(std::vector<uint8_t> &buffer,
63
64
save<uint32_t >(buffer, sectionInfoOffset);
64
65
save<uint32_t >(buffer, 0 ); // name offset
65
66
save<uint32_t >(buffer, 0 ); // name size
66
- save<uint32_t >(buffer, 3 ); // version
67
+ save<uint32_t >(buffer, version ); // version
67
68
68
69
save<uint32_t >(buffer, totalBssSize);
69
70
save<uint32_t >(buffer, relocationOffset);
@@ -76,9 +77,15 @@ void writeModuleHeader(std::vector<uint8_t> &buffer,
76
77
save<uint32_t >(buffer, prologOffset);
77
78
save<uint32_t >(buffer, epilogOffset);
78
79
save<uint32_t >(buffer, unresolvedOffset);
79
- save<uint32_t >(buffer, maxAlign);
80
- save<uint32_t >(buffer, maxBssAlign);
81
- save<uint32_t >(buffer, fixedDataSize);
80
+ if (version >= 2 )
81
+ {
82
+ save<uint32_t >(buffer, maxAlign);
83
+ save<uint32_t >(buffer, maxBssAlign);
84
+ }
85
+ if (version >= 3 )
86
+ {
87
+ save<uint32_t >(buffer, fixedDataSize);
88
+ }
82
89
}
83
90
84
91
void writeSectionInfo (std::vector<uint8_t > &buffer, int offset, int size)
@@ -117,6 +124,7 @@ int main(int argc, char **argv)
117
124
std::string lstFilename;
118
125
std::string relFilename = " " ;
119
126
int moduleID = 33 ;
127
+ int relVersion = 3 ;
120
128
121
129
{
122
130
namespace po = boost::program_options;
@@ -127,7 +135,8 @@ int main(int argc, char **argv)
127
135
(" input-file,i" , po::value (&elfFilename), " Input ELF filename (required)" )
128
136
(" symbol-file,s" , po::value (&lstFilename), " Input symbol file name (required)" )
129
137
(" output-file,o" , po::value (&relFilename), " Output REL filename" )
130
- (" rel-id" , po::value (&moduleID)->default_value (0x1000 ), " REL file ID" );
138
+ (" rel-id" , po::value (&moduleID)->default_value (0x1000 ), " REL file ID" )
139
+ (" rel-version" , po::value (&relVersion)->default_value (3 ), " REL file format version (1, 2, 3)" );
131
140
132
141
po::positional_options_description positionals;
133
142
positionals.add (" input-file" , -1 );
@@ -144,7 +153,9 @@ int main(int argc, char **argv)
144
153
145
154
if (varMap.count (" help" )
146
155
|| varMap.count (" input-file" ) != 1
147
- || varMap.count (" symbol-file" ) != 1 )
156
+ || varMap.count (" symbol-file" ) != 1
157
+ || relVersion < 1
158
+ || relVersion > 3 )
148
159
{
149
160
std::cout << description << " \n " ;
150
161
return 1 ;
@@ -217,7 +228,7 @@ int main(int argc, char **argv)
217
228
218
229
std::vector<uint8_t > outputBuffer;
219
230
// Dummy values for header until offsets are determined
220
- writeModuleHeader (outputBuffer, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
231
+ writeModuleHeader (outputBuffer, relVersion, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 );
221
232
int sectionInfoOffset = outputBuffer.size ();
222
233
for (int i = 0 ; i < inputElf.sections .size (); ++i)
223
234
{
@@ -523,6 +534,7 @@ int main(int argc, char **argv)
523
534
// Write final header
524
535
std::vector<uint8_t > headerBuffer;
525
536
writeModuleHeader (headerBuffer,
537
+ relVersion,
526
538
moduleID,
527
539
inputElf.sections .size (),
528
540
sectionInfoOffset,
0 commit comments