@@ -62,7 +62,6 @@ void emit_elf32_header(X86Assembler &a, uint32_t p_flags) {
62
62
a.asm_dw_imm16 (0 ); // e_shnum
63
63
a.asm_dw_imm16 (0 ); // e_shstrndx
64
64
65
- a.add_var (" ehdrsize" , a.pos ()-a.get_defined_symbol (" ehdr" ).value );
66
65
67
66
/* Elf32_Phdr */
68
67
a.add_label (" phdr" );
@@ -74,13 +73,16 @@ void emit_elf32_header(X86Assembler &a, uint32_t p_flags) {
74
73
a.asm_dd_label (" filesize" ); // p_memsz
75
74
a.asm_dd_imm32 (p_flags); // p_flags
76
75
a.asm_dd_imm32 (0x1000 ); // p_align
76
+ a.add_label (" phdr_end" );
77
77
78
- a.add_var (" phdrsize" , a.pos ()-a.get_defined_symbol (" phdr" ).value );
79
- a.add_var (" e_phoff" , a.get_defined_symbol (" phdr" ).value -a.origin ());
78
+ a.add_var (" ehdrsize" , " ehdr" , " phdr" );
79
+ a.add_var (" phdrsize" , " phdr" , " phdr_end" );
80
+ a.add_var (" e_phoff" , " ehdr" , " phdr" );
80
81
}
81
82
82
83
void emit_elf32_footer (X86Assembler &a) {
83
- a.add_var_size (" filesize" );
84
+ a.add_label (" footer" );
85
+ a.add_var (" filesize" , " ehdr" , " footer" );
84
86
}
85
87
86
88
void emit_exit (X86Assembler &a, const std::string &name,
@@ -281,8 +283,8 @@ void emit_print_float(X86Assembler &a, const std::string &name) {
281
283
282
284
/* ************************ 64-bit functions **************************/
283
285
284
- void emit_elf64_header (X86Assembler &a, uint32_t p_flags ) {
285
- /* Elf32_Ehdr */
286
+ void emit_elf64_header (X86Assembler &a) {
287
+ /* Elf64_Ehdr */
286
288
a.add_label (" ehdr" );
287
289
// e_ident
288
290
a.asm_db_imm8 (0x7F );
@@ -313,30 +315,54 @@ void emit_elf64_header(X86Assembler &a, uint32_t p_flags) {
313
315
a.asm_dd_imm32 (0 ); // e_flags
314
316
a.asm_dw_label (" ehdrsize" ); // e_ehsize
315
317
a.asm_dw_label (" phdrsize" ); // e_phentsize
316
- a.asm_dw_imm16 (1 ); // e_phnum
318
+ a.asm_dw_imm16 (3 ); // e_phnum
317
319
a.asm_dw_imm16 (0 ); // e_shentsize
318
320
a.asm_dw_imm16 (0 ); // e_shnum
319
321
a.asm_dw_imm16 (0 ); // e_shstrndx
320
322
321
- a.add_var (" ehdrsize" , a.pos ()-a.get_defined_symbol (" ehdr" ).value );
322
-
323
- /* Elf32_Phdr */
323
+ /* Elf64_Phdr */
324
324
a.add_label (" phdr" );
325
- a.asm_dd_imm32 (1 ); // p_type
326
- a.asm_dd_imm32 (p_flags ); // p_flags
325
+ a.asm_dd_imm32 (1 ); // p_type
326
+ a.asm_dd_imm32 (4 ); // p_flags (permission to read only)
327
327
a.asm_dq_imm64 (0 ); // p_offset
328
328
a.asm_dq_imm64 (a.origin ()); // p_vaddr
329
329
a.asm_dq_imm64 (a.origin ()); // p_paddr
330
- a.asm_dq_label (" filesize " ); // p_filesz
331
- a.asm_dq_label (" filesize " ); // p_memsz
330
+ a.asm_dq_label (" phdr_size " ); // p_filesz
331
+ a.asm_dq_label (" phdr_size " ); // p_memsz
332
332
a.asm_dq_imm64 (0x1000 ); // p_align
333
333
334
- a.add_var (" phdrsize" , a.pos ()-a.get_defined_symbol (" phdr" ).value );
335
- a.add_var64 (" e_phoff" , a.get_defined_symbol (" phdr" ).value -a.origin ());
334
+ /* text_segment_phdr */
335
+ a.add_label (" text_phdr" );
336
+ a.asm_dd_imm32 (1 ); // p_type
337
+ a.asm_dd_imm32 (5 ); // p_flags (permission to read and execute)
338
+ a.asm_dq_label (" text_segment_offset" ); // p_offset
339
+ a.asm_dq_label (" text_segment_start" ); // p_vaddr
340
+ a.asm_dq_label (" text_segment_start" ); // p_paddr
341
+ a.asm_dq_label (" text_segment_size" ); // p_filesz
342
+ a.asm_dq_label (" text_segment_size" ); // p_memsz
343
+ a.asm_dq_imm64 (0x1000 ); // p_align
344
+
345
+ /* data_segment_phdr */
346
+ a.add_label (" data_phdr" );
347
+ a.asm_dd_imm32 (1 ); // p_type
348
+ a.asm_dd_imm32 (6 ); // p_flags (permission to read and write)
349
+ a.asm_dq_label (" data_segment_offset" ); // p_offset
350
+ a.asm_dq_label (" data_segment_start" ); // p_vaddr
351
+ a.asm_dq_label (" data_segment_start" ); // p_paddr
352
+ a.asm_dq_label (" data_segment_size" ); // p_filesz
353
+ a.asm_dq_label (" data_segment_size" ); // p_memsz
354
+ a.asm_dq_imm64 (0x1000 ); // p_align
336
355
}
337
356
338
357
void emit_elf64_footer (X86Assembler &a) {
339
- a.add_var_size (" filesize" );
358
+ a.add_var (" ehdrsize" , " ehdr" , " phdr" );
359
+ a.add_var (" phdrsize" , " phdr" , " text_phdr" );
360
+ a.add_var64 (" e_phoff" , " ehdr" , " phdr" );
361
+ a.add_var64 (" phdr_size" , " ehdr" , " text_segment_start" );
362
+ a.add_var64 (" text_segment_offset" , " ehdr" , " text_segment_start" );
363
+ a.add_var64 (" text_segment_size" , " text_segment_start" , " text_segment_end" );
364
+ a.add_var64 (" data_segment_offset" , " ehdr" , " data_segment_start" );
365
+ a.add_var64 (" data_segment_size" , " data_segment_start" , " data_segment_end" );
340
366
}
341
367
342
368
void emit_exit_64 (X86Assembler &a, std::string name, int exit_code) {
0 commit comments