| ; 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 string |
| asmstr db 'hello, world', 0 ; [2] |
| .end |
| |
| ; a string for Printf |
| printfstr db "integer==%d, localint==%d, commvar=%d" |
| db 10, 0 |
| |
| ; some pointers |
| localptr dd localint ; [5] [17] |
| textptr dd greet wrt ..sym ; [15] |
| selfptr dd selfptr wrt ..sym ; [16] |
| |
| [SECTION .bss] |
| |
| ; an integer |
| integer resd 1 ; [3] |
| |
| ; a local integer |
| localint resd 1 ; [6] |