Skip to content

Commit c055cc1

Browse files
committed
Fix elf-clean for stdout.c
1 parent 5351dba commit c055cc1

File tree

1 file changed

+18
-5
lines changed

1 file changed

+18
-5
lines changed

elf-clean.c

+18-5
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,16 @@ void relocate(const char* reloc_type,
124124
switch (type) {
125125
#if defined(__x86_64__)
126126
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+
}
128137
break;
129138
}
130139
case R_X86_64_GLOB_DAT: {
@@ -142,14 +151,16 @@ void relocate(const char* reloc_type,
142151
#else
143152
case R_386_32: {
144153
*addr += (long)val;
154+
break;
145155
}
146156
case R_386_COPY: {
147157
if (val) {
148-
*addr = *(long*)val;
158+
*addr = (long)val;
149159
} else {
150160
fprintf(stderr, "undefined: %s\n", sname);
151161
abort();
152162
}
163+
break;
153164
}
154165
case R_386_GLOB_DAT: {
155166
*addr = (long)val;
@@ -164,6 +175,8 @@ void relocate(const char* reloc_type,
164175
break;
165176
}
166177
#endif
178+
default:
179+
printf("unsupported reloc: %d\n", type);
167180
}
168181
}
169182
}
@@ -174,9 +187,9 @@ int main(int argc, char* argv[]) {
174187
Elf_Ehdr ehdr;
175188
long base_addr = 0;
176189

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;
180193

181194
if (argc < 2)
182195
error("Usage: el <elf>");

0 commit comments

Comments
 (0)