mescc: Add objdump'able x86_64-mes scaffold.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 10 Aug 2018 09:37:55 +0000 (11:37 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 10 Aug 2018 09:37:55 +0000 (11:37 +0200)
* lib/x86_64-mes/elf64-header.hex2: New file.
* lib/x86_64-mes/elf64-footer-single-main.hex2: New file.
* build-aux/build-x86_64-mes.sh: Enable second, objdump'able exit-42
  scaffold test.

build-aux/build-x86_64-mes.sh
lib/x86_64-mes/elf64-footer-single-main.hex2 [new file with mode: 0644]
lib/x86_64-mes/elf64-header.hex2 [new file with mode: 0644]
lib/x86_64-mes/exit-42.c

index 2144f81298255a4d58dc98f4605a2f41e1e890dd..3239d351e82873eae3326d2fcde48acf70b81ac9 100755 (executable)
@@ -46,19 +46,19 @@ trace "TEST 0exit-42"
 { set +e; lib/x86_64-mes/0exit-42.x86_64-out; r=$?; set -e; }
 [ $r != 42 ] && echo "  => $r" && exit 1
 
-trace "HEX2 0exit-42" $HEX2\
-    --LittleEndian\
-    --Architecture 2\
-    --BaseAddress 0x1000000\
-    -f ${srcdest}lib/x86_64-mes/elf64-header.hex2\
-    -f ${srcdest}lib/x86_64-mes/elf64-body-exit-42.hex2\
-    -f ${srcdest}lib/x86_64-mes/elf64-footer-single-main.hex2\
-    --exec_enable\
-    -o lib/x86_64-mes/exit-42.x86_64-out
-
-trace "TEST exit-42"
-{ set +e; lib/x86_64-mes/exit-42.x86_64-out; r=$?; set -e; }
-[ $r != 42 ] && echo "  => $r" && exit 1
+trace "HEX2 0exit-42" $HEX2\
+    --LittleEndian\
+    --Architecture 2\
+    --BaseAddress 0x1000000\
+    -f ${srcdest}lib/x86_64-mes/elf64-header.hex2\
+    -f ${srcdest}lib/x86_64-mes/elf64-body-exit-42.hex2\
+    -f ${srcdest}lib/x86_64-mes/elf64-footer-single-main.hex2\
+    --exec_enable\
+    -o lib/x86_64-mes/exit-42.x86_64-out
+
+trace "TEST exit-42"
+{ set +e; lib/x86_64-mes/exit-42.x86_64-out; r=$?; set -e; }
+[ $r != 42 ] && echo "  => $r" && exit 1
 
 # if [ -d "$MES_SEED" ]; then
 #     mkdir -p lib/x86_64-mes
diff --git a/lib/x86_64-mes/elf64-footer-single-main.hex2 b/lib/x86_64-mes/elf64-footer-single-main.hex2
new file mode 100644 (file)
index 0000000..6caed91
--- /dev/null
@@ -0,0 +1,62 @@
+### Copyright (C) 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+### This file is part of stage0.
+###
+### stage0 is free software: you an redistribute it and/or modify
+### it under the terms of the GNU General Public License as published by
+### the Free Software Foundation, either version 3 of the License, or
+### (at your option) any later version.
+###
+### stage0 is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with stage0.  If not, see <http://www.gnu.org/licenses/>.
+
+### stage0's hex2 format for x86_64
+###    !<label>          1 byte relative
+###    $<label>          2 byte address
+###    @<label>          2 byte relative
+###    &<label>          4 byte address
+###    %<label>          4 byte relative
+###    local_<label>     function-local
+###    string_<index>    string #<index>
+
+# @230
+
+:ELF_str
+00                             # 0
+:ELF_str__start
+5f 73 74 61 72 74 00           # _start
+:ELF_str__main
+6d 61 69 6e 00                 # main
+
+00 00 00
+
+# @240
+:ELF_sym
+00 00 00 00                    # st-name
+00                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+00 00 00 00 00 00 00 00        # st-offset: &_start - BaseAddress
+00 00 00 00 00 00 00 00        # st-len   : &main - _start
+
+# _start
+%ELF_str__start>ELF_str        # st-name
+02                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+&_start 00 00 00 00
+10 00 00 00 00 00 00 00        # st-len   : &main - _start
+
+# main
+%ELF_str__main>ELF_str         # st-name
+02                             # st-info = stt-func= 2
+00                             # st-other
+01 00                          # st-shndx: 1
+&main 00 00 00 00
+10 00 00 00 00 00 00 00        # st-len   : &ELF_data - main
+
+:ELF_end
diff --git a/lib/x86_64-mes/elf64-header.hex2 b/lib/x86_64-mes/elf64-header.hex2
new file mode 100644 (file)
index 0000000..582b874
--- /dev/null
@@ -0,0 +1,233 @@
+### Copyright (C) 2016 Jeremiah Orians
+### Copyright (C) 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+### This file is part of stage0.
+###
+### stage0 is free software: you an redistribute it and/or modify
+### it under the terms of the GNU General Public License as published by
+### the Free Software Foundation, either version 3 of the License, or
+### (at your option) any later version.
+###
+### stage0 is distributed in the hope that it will be useful,
+### but WITHOUT ANY WARRANTY; without even the implied warranty of
+### MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+### GNU General Public License for more details.
+###
+### You should have received a copy of the GNU General Public License
+### along with stage0.  If not, see <http://www.gnu.org/licenses/>.
+
+### stage0's hex2 format for x86_64
+###    !<label>          1 byte relative
+###    $<label>          2 byte address
+###    @<label>          2 byte relative
+###    &<label>          4 byte address
+###    %<label>          4 byte relative
+###    local_<label>     function-local
+###    string_<index>    string #<index>
+
+:ELF_base
+7F 45 4c 46                    # e_ident[EI_MAG0-3] ELF's magic number
+
+02                             # e_ident[EI_CLASS] Indicating 64 bit
+01                             # e_ident[EI_DATA] Indicating little endianness
+01                             # e_ident[EI_VERSION] Indicating original elf
+
+00                             # e_ident[EI_OSABI] Set at 0 because none cares
+00                             # e_ident[EI_ABIVERSION] See above
+
+00 00 00 00 00 00 00           # e_ident[EI_PAD]
+
+02 00                          # e_type Indicating Executable
+3e 00                          # e_machine Indicating AMD64
+01 00 00 00                    # e_version Indicating original elf
+
+&ELF_text 00 00 00 00          # e_entry Address of the entry point
+%ELF_program_headers>ELF_base  # e_phoff Address of program header table
+  00 00 00 00
+
+%ELF_section_headers>ELF_base  # e_shoff Address of section header table
+  00 00 00 00
+
+00 00 00 00                    # e_flags
+
+40 00                          # e_ehsize Indicating our 64 Byte header
+
+38 00                          # e_phentsize size of a program header table
+01 00                          # e_phnum number of entries in program table
+
+40 00                          # e_shentsize size of a section header table
+07 00                          # e_shnum number of entries in section table
+
+04 00                          # e_shstrndx index of the section names
+
+# @40
+:ELF_program_headers
+:ELF_program_header__text
+01 00 00 00                    # ph_type: PT-LOAD = 1
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+00 00 00 00 00 00 00 00        # p_offset
+&ELF_base 00 00 00 00          # ph_vaddr
+&ELF_base 00 00 00 00          # ph_physaddr
+%ELF_end>ELF_base 00 00 00 00  # ph_filesz
+%ELF_end>ELF_base 00 00 00 00  # ph_memsz
+01 00 00 00 00 00 00 00        # ph_align
+
+
+# @60
+#:ELF_program_header__data     # NOT USED
+                               # FIXME: linux 4.17 does not allow this overlap
+                               #    Uhuuh, elf segment at 0000000001000000
+                               #    requested but the memory is mapped already
+01 00 00 00                    # ph_type: PT-LOAD = 1
+07 00 00 00                    # ph_flags: PF-X|PF-W|PF-R = 7
+00 00 00 00 00 00 00 00        # ph_offset
+&ELF_base 00 00 00 00          # ph_vaddr
+&ELF_base 00 00 00 00          # ph_physaddr
+%ELF_end>ELF_base 00 00 00 00  # ph_filesz
+%ELF_end>ELF_base 00 00 00 00  # ph_memsz
+01 00 00 00 00 00 00 00        # ph_align
+
+# @b0
+:ELF_comment
+4d 45 53 00                     # MES
+00 00 00 00                     # align
+00 00 00 00
+00 00 00 00
+
+# @c0
+4d 45 53 00                     # MES
+00 00 00 00                     # align
+00 00 00 00
+00 00 00 00
+
+# @d0
+:ELF_shstr
+00
+:ELF_shstr__text
+2e 74 65 78 74 00               # .text
+:ELF_shstr__data
+2e 64 61 74 61 00               # .data
+:ELF_shstr__comment
+2e 63 6f 6d 6d 65 6e 74 00      # .comment
+:ELF_shstr__shstr
+2e 73 68 73 74 72 74 61 62 00   # .shstrtab
+:ELF_shstr__sym
+2e 73 79 6d 74 61 62 00         # .symtab
+:ELF_shstr__str
+2e 73 74 72 74 61 62 00         # .strtab
+
+# @100
+
+:ELF_section_headers
+00 00 00 00                     # sh_name
+00 00 00 00                     # sh_type
+00 00 00 00 00 00 00 00         # sh_flags
+00 00 00 00 00 00 00 00         # sh_addr
+00 00 00 00 00 00 00 00         # sh_offset
+00 00 00 00 00 00 00 00         # sh_length
+00 00 00 00                     # sh_link
+00 00 00 00                     # sh_info
+01 00 00 00 00 00 00 00         # sh_1?
+00 00 00 00 00 00 00 00         # sh_entsize
+
+## FIXME: M0 for calculations?
+:ELF_section_header_text
+%ELF_shstr__text>ELF_shstr      # sh_name
+01 00 00 00                     # sh_type = SHT_PROGBITS = 1
+06 00 00 00 00 00 00 00         # sh_flags = SHF-ALLOC|SHF-EXEC =2 | 4 = 6
+&ELF_text 00 00 00 00           # sh_addr
+%ELF_text>ELF_base 00 00 00 00  # sh_offset
+%ELF_data>ELF_text 00 00 00 00  # sh_length
+00 00 00 00                     # sh_link
+00 00 00 00                     # sh_info
+01 00 00 00 00 00 00 00         # sh_1?
+00 00 00 00 00 00 00 00         # sh_entsize
+
+:ELF_section_header_data
+%ELF_shstr__data>ELF_shstr     # sh_name
+01 00 00 00                    # sh_type = SHT_PROGBITS = 1
+03 00 00 00 00 00 00 00        # sh_flags = SHF-WRITE|SHF-ALLOC = 1 | 2 = 3
+&ELF_data 00 00 00 00          # sh_addr
+%ELF_data>ELF_base 00 00 00 00 # sh_offset
+%ELF_sym>ELF_data 00 00 00 00  # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00 00 00 00 00        # sh_1?
+00 00 00 00 00 00 00 00        # sh_entsize
+
+:ELF_section_header_comment
+%ELF_shstr__comment>ELF_shstr  # sh_name
+01 00 00 00                    # sh_type = SHT_PROGBITS = 1
+00 00 00 00 00 00 00 00        # sh_flags
+&ELF_comment 00 00 00 00       # sh_addr
+%ELF_comment>ELF_base 00 00 00 00 # sh_offset
+%ELF_shstr>ELF_comment 00 00 00 00 # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00 00 00 00 00        # sh_1?
+00 00 00 00 00 00 00 00        # sh_entsize
+
+:ELF_section_header_shstr
+%ELF_shstr__shstr>ELF_shstr    # sh_name
+03 00 00 00                    # sh_type: str-sht-strtab
+00 00 00 00 00 00 00 00        # sh_flags
+&ELF_shstr 00 00 00 00         # sh_addr
+%ELF_shstr>ELF_base 00 00 00 00 # sh_offset
+%ELF_section_headers>ELF_shstr 00 00 00 00 # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00 00 00 00 00        # sh_1?
+00 00 00 00 00 00 00 00        # sh_entsize
+
+:ELF_section_header_sym
+%ELF_shstr__sym>ELF_shstr      # sh_name
+## FIXME: using type 03 (strtab) makes objdump -d happier
+## using type 02 make readelf complain but display valid symbol table
+# 03 00 00 00                    # sh_type: str-sht-symtab
+02 00 00 00                    # sh_type: str-sht-symtab
+00 00 00 00 00 00 00 00        # sh_flags
+&ELF_sym 00 00 00 00           # sh_addr
+%ELF_sym>ELF_base 00 00 00 00  # sh_offset
+%ELF_end>ELF_sym 00 00 00 00   # sh_length
+06 00 00 00                    # sh_link:6
+00 00 00 00                    # sh_info
+00 00 00 00 00 00 00 00        # sh_1?
+40 00 00 00 00 00 00 00        # sh_entsize
+
+:ELF_section_header_str
+%ELF_shstr__str>ELF_shstr      # sh_name
+03 00 00 00                    # sh_type: str-sht-strtab
+00 00 00 00 00 00 00 00        # sh_flags
+&ELF_str 00 00 00 00           # sh_addr
+%ELF_str>ELF_base 00 00 00 00  # sh_offset
+%ELF_sym>ELF_str 00 00 00 00   # sh_length
+00 00 00 00                    # sh_link
+00 00 00 00                    # sh_info
+01 00 00 00 00 00 00 00        # sh_1?
+00 00 00 00 00 00 00 00        # sh_entsize
+
+# @2c0
+00 00 00 00  # align
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @2d0
+00 00 00 00  # align
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @2e0
+00 00 00 00  # align
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @2f0
+00 00 00 00  # align
+00 00 00 00
+00 00 00 00
+00 00 00 00
+
+# @300
+:ELF_text
index 8e0b35f0599db26d7b3a5d1eabce7a0d6f3e6155..76f273f185d01bae7d47fbf089cf9829a5d1602d 100644 (file)
@@ -21,7 +21,7 @@
 int
 main (int argc, char *argv[])
 {
-#if 1
+#if 0
   asm ("mov $00,%rdi");
   asm ("mov $0x3c,%rax");
   asm ("syscall");