--- /dev/null
+/* text: in the 32-bit address range.
+   data: far away from text. */
+
+ENTRY(_start)
+MEMORY
+{
+       rom (rx)  : ORIGIN = 0x10000, LENGTH = 0x1000
+       ram (!rx) : ORIGIN = 0x800000000, LENGTH = 0x1000
+}
+SECTIONS {
+       .text : {
+               *(.text*)
+       } >rom
+
+       .data : {
+               *(.data*)
+       } >ram
+
+       __global_pointer$ = .;
+
+       .got : {
+               *(.got*)
+       } > ram
+}
 
--- /dev/null
+/* text: over the 32-bit address range.
+   data: far away from text, and nearly-zero. */
+
+ENTRY(_start)
+MEMORY
+{
+       rom (rx)  : ORIGIN = 0x800000000, LENGTH = 0x1000
+       ram (!rx) : ORIGIN = 0x10, LENGTH = 0x1000
+}
+SECTIONS {
+       .text : {
+               *(.text*)
+       } >rom
+
+       .data : {
+               *(.data*)
+       } >ram
+
+       __global_pointer$ = .;
+
+       .got : {
+               *(.got*)
+       } > ram
+}
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medany__=1
+#ld: -Tcode-model-01.ld -melf64lriscv --no-relax
+#error: .*relocation truncated to fit: R_RISCV_GOT_HI20 against symbol `symbolG'
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medany__=1
+#ld: -Tcode-model-02.ld -melf64lriscv --no-relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+800000000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+lui[  ]+t0,0x[0-9a-f]+
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+ld[   ]+t0,[0-9]+\(t0\) # [0-9a-f]+ <_GLOBAL_OFFSET_TABLE_\+0x[0-9a-f]+>
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+lui[  ]+t0,0x[0-9a-f]+
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,t0,[0-9]+ # [0-9a-f]+ <symbolL>
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+lui[  ]+t0,0x[0-9a-f]+
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,t0,[0-9]+ # [0-9a-f]+ <symbolG>
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medany__=1 --defsym __undefweak__=1
+#ld: -Tcode-model-01.ld -melf64lriscv --no-relax
+#error: .*relocation truncated to fit: R_RISCV_GOT_HI20 against undefined symbol `symbolW'
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medany__=1 --defsym __undefweak__=1
+#ld: -Tcode-model-02.ld -melf64lriscv --no-relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+800000000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+lui[  ]+t0,0x0
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+ld[   ]+t0,[0-9]+\(t0\) # [0-9a-f]+ <_GLOBAL_OFFSET_TABLE_\+0x[0-9a-f]+>
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medlow__=1
+#ld: -Tcode-model-01.ld -melf64lriscv --no-relax
+#error: .*relocation truncated to fit: R_RISCV_HI20 against `symbolL'
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medlow__=1
+#ld: -Tcode-model-02.ld -melf64lriscv --no-relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+800000000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+lui[  ]+t0,0x[0-9a-f]+
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,t0,[0-9]+ # [0-9a-f]+ <symbolL>
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+lui[  ]+t0,0x[0-9a-f]+
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,t0,[0-9]+ # [0-9a-f]+ <symbolG>
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medlow__=1 --defsym __undefweak__=1
+#ld: -Tcode-model-01.ld -melf64lriscv --no-relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+10000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+lui[  ]+t0,0x0
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,t0,0 # 0 <.*>
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medlow__=1 --defsym __undefweak__=1
+#ld: -Tcode-model-02.ld -melf64lriscv --no-relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+800000000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+lui[  ]+t0,0x0
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,t0,0 # 0 <.*>
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medany__=1
+#ld: -Tcode-model-01.ld -melf64lriscv --relax
+#error: .*relocation truncated to fit: R_RISCV_GOT_HI20 against symbol `symbolG'
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medany__=1
+#ld: -Tcode-model-02.ld -melf64lriscv --relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+800000000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+lui[  ]+t0,0x[0-9a-f]+
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+ld[   ]+t0,[0-9]+\(t0\) # [0-9a-f]+ <_GLOBAL_OFFSET_TABLE_\+0x[0-9a-f]+>
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,zero,[0-9]+
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,zero,[0-9]+
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medany__=1 --defsym __undefweak__=1
+#ld: -Tcode-model-01.ld -melf64lriscv --relax
+#error: .*relocation truncated to fit: R_RISCV_GOT_HI20 against undefined symbol `symbolW'
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medany__=1 --defsym __undefweak__=1
+#ld: -Tcode-model-02.ld -melf64lriscv --relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+800000000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+lui[  ]+t0,0x0
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+ld[   ]+t0,[0-9]+\(t0\) # [0-9a-f]+ <_GLOBAL_OFFSET_TABLE_\+0x[0-9a-f]+>
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medlow__=1
+#ld: -Tcode-model-01.ld -melf64lriscv --relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+10000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,gp,\-[0-9]+ # [0-9a-f]+ <symbolL>
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,gp,\-[0-9]+ # [0-9a-f]+ <symbolG>
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medlow__=1
+#ld: -Tcode-model-02.ld -melf64lriscv --relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+800000000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,zero,[0-9]+
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,zero,[0-9]+
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medlow__=1 --defsym __undefweak__=1
+#ld: -Tcode-model-01.ld -melf64lriscv --relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+10000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,zero,0
 
--- /dev/null
+#source: code-model.s
+#as: -march=rv64i -mabi=lp64 --defsym __medlow__=1 --defsym __undefweak__=1
+#ld: -Tcode-model-02.ld -melf64lriscv --relax
+#objdump: -d -Mno-aliases
+
+.*:[   ]+file format .*
+
+
+Disassembly of section .text:
+
+0+800000000 <_start>:
+[      ]+[0-9a-f]+:[   ]+[0-9a-f]+[    ]+addi[         ]+t0,zero,0
 
--- /dev/null
+       .text
+       .global _start
+_start:
+
+.ifdef __medany__
+       .option pic
+.ifdef __undefweak__
+       # Refer to undefined weak symbol by GOT_PCREL.
+       la      t0, symbolW
+       .option nopic
+.else
+       # Refer to global data symbol by GOT_PCREL.
+       la      t0, symbolG
+       .option nopic
+       # Refer to local data symbol by PCREL.
+       lla     t0, symbolL
+       # Refer to non-pic data global symbol by PCREL.
+       la      t0, symbolG
+.endif
+.endif
+
+.ifdef __medlow__
+.ifdef __undefweak__
+       # Refer to undefined weak symbol by absolutely access.
+       lui     t0, %hi(symbolW)
+       addi    t0, t0, %lo(symbolW)
+.else
+       # Refer to local data symbol by absolutely access.
+       lui     t0, %hi(symbolL)
+       addi    t0, t0, %lo(symbolL)
+       # Refer to global data symbol by absolutely access.
+       lui     t0, %hi(symbolG)
+       addi    t0, t0, %lo(symbolG)
+.endif
+.endif
+       .size   _start, .-_start
+
+       .data
+       .global symbolG
+symbolL:
+       .dword  0x1111222233334444
+symbolG:
+       .dword  0x5555666677778888
+
+.ifdef __undefweak__
+       .weak   symbolW
+.endif
 
     run_dump_test "pcrel-lo-addend-3a"
     run_dump_test "pcrel-lo-addend-3b"
     run_dump_test "pcrel-lo-addend-3c"
+    run_dump_test "code-model-medlow-01"
+    run_dump_test "code-model-medlow-02"
+    run_dump_test "code-model-medlow-weakref-01"
+    run_dump_test "code-model-medlow-weakref-02"
+    run_dump_test "code-model-medany-01"
+    run_dump_test "code-model-medany-02"
+    run_dump_test "code-model-medany-weakref-01"
+    run_dump_test "code-model-medany-weakref-02"
+    run_dump_test "code-model-relax-medlow-01"
+    run_dump_test "code-model-relax-medlow-02"
+    run_dump_test "code-model-relax-medlow-weakref-01"
+    run_dump_test "code-model-relax-medlow-weakref-02"
+    run_dump_test "code-model-relax-medany-01"
+    run_dump_test "code-model-relax-medany-02"
+    run_dump_test "code-model-relax-medany-weakref-01"
+    run_dump_test "code-model-relax-medany-weakref-02"
     run_dump_test "attr-merge-arch-01"
     run_dump_test "attr-merge-arch-02"
     run_dump_test "attr-merge-arch-03"