📄 elfso64.asm
字号:
; This code is UNTESTED, and almost certainly DOES NOT WORK!; Do NOT use this as an example of how to write AMD64 shared libraries!; This code is simply to test the AMD64 ELF WRT relocations.; This file should test the following:; [1] Define and export a global text-section symbol; [2] Define and export a global data-section symbol; [3] Define and export a global BSS-section symbol; [4] Define a non-global text-section symbol; [5] Define a non-global data-section symbol; [6] Define a non-global BSS-section symbol; [7] Define a COMMON symbol; [8] Define a NASM local label; [9] Reference a NASM local label; [10] Import an external symbol; [11] Make a PC-relative call to an external symbol; [12] Reference a text-section symbol in the text section; [13] Reference a data-section symbol in the text section; [14] Reference a BSS-section symbol in the text section; [15] Reference a text-section symbol in the data section; [16] Reference a data-section symbol in the data section; [17] Reference a BSS-section symbol in the data section BITS 64 GLOBAL lrotate:function ; [1] GLOBAL greet:function ; [1] GLOBAL asmstr:data asmstr.end-asmstr ; [2] GLOBAL textptr:data 4 ; [2] GLOBAL selfptr:data 4 ; [2] GLOBAL integer:data 4 ; [3] EXTERN printf ; [10] COMMON commvar 4:4 ; [7] EXTERN _GLOBAL_OFFSET_TABLE_ SECTION .text; prototype: long lrotate(long x, int num);lrotate: ; [1] push rbp mov rbp,rsp mov rax,[rbp+8] mov rcx,[rbp+12].label rol rax,1 ; [4] [8] loop .label ; [9] [12] mov rsp,rbp pop rbp ret; prototype: void greet(void);greet push rbx ; we'll use RBX for GOT, so save it mov rbx,[integer wrt ..gotpcrel wrt rip] mov rax,[rbx] ; [14] inc rax mov rbx,[_GLOBAL_OFFSET_TABLE_ wrt ..gotpcrel wrt rip] mov [rbx+localint wrt ..got],eax ; [14] mov rax,[rbx+commvar wrt ..got] push qword [rax] mov rax,[rbx+localptr wrt ..got] ; [13] push qword [rax] mov rax,[rbx+integer wrt ..got] ; [1] [14] push qword [rax] lea rax,[rbx+printfstr wrt ..got] push rax ; [13] call printf wrt ..plt ; [11] add rsp,16 pop rbx ret SECTION .data; a stringasmstr db 'hello, world', 0 ; [2].end; a string for Printfprintfstr db "integer==%d, localint==%d, commvar=%d" db 10, 0; some pointerslocalptr dd localint ; [5] [17]textptr dd greet wrt ..sym ; [15]selfptr dd selfptr wrt ..sym ; [16] SECTION .bss; an integerinteger resd 1 ; [3]; a local integerlocalint resd 1 ; [6]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -