File tree 1 file changed +18
-5
lines changed
1 file changed +18
-5
lines changed Original file line number Diff line number Diff line change @@ -124,7 +124,16 @@ void relocate(const char* reloc_type,
124
124
switch (type ) {
125
125
#if defined(__x86_64__ )
126
126
case R_X86_64_RELATIVE : {
127
- * addr += (long )base_addr ;
127
+ * addr += (long )(base_addr + rel -> r_addend );
128
+ break ;
129
+ }
130
+ case R_X86_64_COPY : {
131
+ if (val ) {
132
+ * addr = (long )val ;
133
+ } else {
134
+ fprintf (stderr , "undefined: %s\n" , sname );
135
+ abort ();
136
+ }
128
137
break ;
129
138
}
130
139
case R_X86_64_GLOB_DAT : {
@@ -142,14 +151,16 @@ void relocate(const char* reloc_type,
142
151
#else
143
152
case R_386_32 : {
144
153
* addr += (long )val ;
154
+ break ;
145
155
}
146
156
case R_386_COPY : {
147
157
if (val ) {
148
- * addr = * (long * )val ;
158
+ * addr = (long )val ;
149
159
} else {
150
160
fprintf (stderr , "undefined: %s\n" , sname );
151
161
abort ();
152
162
}
163
+ break ;
153
164
}
154
165
case R_386_GLOB_DAT : {
155
166
* addr = (long )val ;
@@ -164,6 +175,8 @@ void relocate(const char* reloc_type,
164
175
break ;
165
176
}
166
177
#endif
178
+ default :
179
+ printf ("unsupported reloc: %d\n" , type );
167
180
}
168
181
}
169
182
}
@@ -174,9 +187,9 @@ int main(int argc, char* argv[]) {
174
187
Elf_Ehdr ehdr ;
175
188
long base_addr = 0 ;
176
189
177
- HOST_SYMS [0 ].sym = & stdin ;
178
- HOST_SYMS [1 ].sym = & stdout ;
179
- HOST_SYMS [2 ].sym = & stderr ;
190
+ HOST_SYMS [0 ].sym = stdin ;
191
+ HOST_SYMS [1 ].sym = stdout ;
192
+ HOST_SYMS [2 ].sym = stderr ;
180
193
181
194
if (argc < 2 )
182
195
error ("Usage: el <elf>" );
You can’t perform that action at this time.
0 commit comments