diff --git a/.gitignore b/.gitignore index ec6878726ea945b1c827707b40b3556478815a9d..9eec8c0d5a11200c0f9f49b1c5ca06f8278960c4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ /linux.img /setup /tools/build +a.out diff --git a/tools/linkerscript/a.out.header b/tools/linkerscript/a.out.header new file mode 100644 index 0000000000000000000000000000000000000000..18b9866780b9b5a158de46fb452613b2cec8d4fc Binary files /dev/null and b/tools/linkerscript/a.out.header differ diff --git a/tools/linkerscript/a.out.header.c b/tools/linkerscript/a.out.header.c new file mode 100644 index 0000000000000000000000000000000000000000..d621be101ce04ce1693c921905ddd9b2b9d0cde4 --- /dev/null +++ b/tools/linkerscript/a.out.header.c @@ -0,0 +1,21 @@ +struct exec { + unsigned long a_magic; + unsigned a_text; + unsigned a_data; + unsigned a_bss; + unsigned a_syms; + unsigned a_entry; + unsigned a_trsize; + unsigned a_drsize; +}; + +struct exec header = { + 0413, /* a_magic */ + 0, /* a_text */ + 0, /* a_data */ + 0, /* a_bss */ + 0, /* a_syms */ + 0, /* a_entry */ + 0, /* a_trsize */ + 0, /* a_drsize */ +}; diff --git a/tools/linkerscript/a.out.header.s b/tools/linkerscript/a.out.header.s new file mode 100644 index 0000000000000000000000000000000000000000..e47de5c128bff2bf16da6553739697e3f65771a8 --- /dev/null +++ b/tools/linkerscript/a.out.header.s @@ -0,0 +1,12 @@ + .section .a.out.header, "a", @progbits + .align 32 + .size header, 32 +header: + .long 267 /* ZMAGIC */ + .long .textsize /* a_text */ + .long .datasize /* a_data */ + .long .bsssize /* a_bss */ + .long .symsize /* a_syms */ + .long 0 /* a_entry */ + .long 0 /* a_trsize */ + .long 0 /* a_drsize */ diff --git a/tools/linkerscript/a.out.lds b/tools/linkerscript/a.out.lds new file mode 100644 index 0000000000000000000000000000000000000000..c667df3e5b19d987bd5358c0426c334141d0713a --- /dev/null +++ b/tools/linkerscript/a.out.lds @@ -0,0 +1,34 @@ +OUTPUT_FORMAT(binary) +SECTIONS +{ + . = 0x400; + .text : ALIGN(0x400) { + PROVIDE(.text_begin = .); + *(.text) + PROVIDE(.text_end = .); + } + .data : ALIGN(0x400) { + PROVIDE(.data_begin = .); + *(.data) + *(.rodata) + *(.rodata1) + PROVIDE(.data_end = .); + } + .bss : ALIGN(0x400) { + PROVIDE(.bss_begin = .); + *(.bss) + PROVIDE(.bss_end = .); + } + .symtab : ALIGN(0x400) { + PROVIDE(.sym_begin = .); + *(.symtab) + PROVIDE(.sym_end = .); + } + PROVIDE(.textsize = SIZEOF(.text)); + PROVIDE(.datasize = SIZEOF(.data)); + PROVIDE(.bsssize = SIZEOF(.bss)); + PROVIDE(.symsize = SIZEOF(.symtab)); + . = 0x0; + .header : { *a.out.header(.a.out.header) } + /DISCARD/ : { *(.eh_frame) *(.comment) *(.rel.eh_frame) *(.note.GNU-stack) } +} diff --git a/tools/linkerscript/sample/build.sh b/tools/linkerscript/sample/build.sh new file mode 100755 index 0000000000000000000000000000000000000000..ede72aebeabaefac2906ae76cf80ed4fa7220799 --- /dev/null +++ b/tools/linkerscript/sample/build.sh @@ -0,0 +1,4 @@ +#!/bin/bash +export LDEMULATION=elf_i386 +gcc foo.c -c -fno-pic -m32 +ld -T ../a.out.lds ../a.out.header foo.o -o a.out diff --git a/tools/linkerscript/sample/foo.c b/tools/linkerscript/sample/foo.c new file mode 100644 index 0000000000000000000000000000000000000000..3a1571941b3fc2b95eb216904795b0d271249010 --- /dev/null +++ b/tools/linkerscript/sample/foo.c @@ -0,0 +1,16 @@ +static char c = 'A'; +static int bss = 0; +int compareStr(char *str, int len) { + for (int i = 0; i < len; ++i) { + if (str[i] == c) { + return 1; + } + } + return bss; +} +int _start() { + if (compareStr("Hello World", 11)) { + return 1; + } + return 0; +}