https://sourceware.org/bugzilla/show_bug.cgi?id=29004
remuladgryta <foss at remuladgryta dot se> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |foss at remuladgryta dot se --- Comment #3 from remuladgryta <foss at remuladgryta dot se> --- (In reply to Nelson Chu from comment #2) > > Not sure what's . fails mean. I can get the same symbol value 8 for > _thread, when using . and 9f: > > % cat tmp.s > .macro _header_ name, cfa > .section .data # assemble into head space > .quad _thread > .set _thread, . > 8: # address to link next word header against > .string "\name" > .set lex, 0 > .quad \cfa # point header at new words cfa > .previous # assemble into list space > .endm > > _header_ A, B > % riscv64-unknown-elf-as -mno-arch-attr tmp.s -o tmp.o > % riscv64-unknown-elf-readelf -Ws tmp.o > > Symbol table '.symtab' contains 7 entries: > Num: Value Size Type Bind Vis Ndx Name > 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND > 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text > 2: 0000000000000000 0 SECTION LOCAL DEFAULT 2 .data > 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 .bss > 4: 0000000000000008 0 NOTYPE LOCAL DEFAULT 2 _thread > 5: 0000000000000000 0 NOTYPE LOCAL DEFAULT ABS lex > 6: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND B > I recently ran into this issue while porting a FORTH implementation to RISC-V (it looks like OP was doing the same, cfa is a FORTH acronym for code field address). The first invocation of the macro is fine, but it blows up on subsequent invocations: % cat tmp.s # In FORTH, functions (words) are stored in a linked-list dictionary. # A dictionary entry is typically a header followed by the function body. # The FORTH VM keeps track of the most recently defined word so that words # can be looked up by name at runtime by walking the dictionary. .set link, 0 .macro HEADER name, code _header_\name: .int link # the header has a pointer to the preceding entry .set link, _header_\name .ascii "\name" # and the name of the word .int \code # and a pointer to its function body .endm HEADER FOO, code_FOO code_FOO: nop # code body of the word FOO HEADER BAR, code_BAR code_BAR: nop # code body of the word BAR # some words are aliases or have other special semantics, # so machine code doesn't always follow the header HEADER BAZ, code_BAR % riscv64-unknown-elf-as tmp.s -o tmp.o tmp.s: Assembler messages: tmp.s:19: Error: redefined symbol cannot be used on reloc tmp.s:25: Error: redefined symbol cannot be used on reloc The same file does assemble using, say, x86_64-linux-gnu-as: % x86_64-linux-gnu-readelf -Ws tmp.o Symbol table '.symtab' contains 8 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text 2: 0000000000000018 0 NOTYPE LOCAL DEFAULT 1 link 3: 0000000000000000 0 NOTYPE LOCAL DEFAULT 1 _header_FOO 4: 000000000000000b 0 NOTYPE LOCAL DEFAULT 1 code_FOO 5: 000000000000000c 0 NOTYPE LOCAL DEFAULT 1 _header_BAR 6: 0000000000000017 0 NOTYPE LOCAL DEFAULT 1 code_BAR 7: 0000000000000018 0 NOTYPE LOCAL DEFAULT 1 _header_BAZ A workaround is possible, but cumbersome and error prone: % cat workaround.s # In FORTH, functions (words) are stored in a linked-list dictionary. # A dictionary entry is typically a header followed by the function body. # The FORTH VM keeps track of the most recently defined word so that words # can be looked up by name at runtime by walking the dictionary. .macro HEADER name, code, backlink _header_\name: .int backlink # the header has a pointer to the preceding entry .ascii "\name" # and the name of the word .int \code # and a pointer to its function body .endm HEADER FOO, code_FOO code_FOO: nop # code body of the word FOO HEADER BAR, code_BAR, name_FOO code_BAR: nop # code body of the word BAR # some words are aliases or have other special semantics, # so machine code doesn't always follow the header HEADER BAZ, code_BAR, name_BAR % riscv64-unknown-elf-as workaround.s -o workaround.o % riscv64-unknown-elf-readelf -Ws workaround.o Symbol table '.symtab' contains 17 entries: Num: Value Size Type Bind Vis Ndx Name 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND 1: 0000000000000000 0 SECTION LOCAL DEFAULT 1 .text 2: 0000000000000000 0 SECTION LOCAL DEFAULT 3 .data 3: 0000000000000000 0 SECTION LOCAL DEFAULT 4 .bss 4: 0000000000000000 0 NOTYPE LOCAL DEFAULT 1 _header_FOO 5: 0000000000000000 0 NOTYPE LOCAL DEFAULT 1 $d 6: 000000000000000b 0 NOTYPE LOCAL DEFAULT 1 code_FOO 7: 000000000000000b 0 NOTYPE LOCAL DEFAULT 1 $xrv64i2p1_m2p0_a2p1_f2p2_d2p2_zicsr2p0_zifencei2p0_zmmul1p0 8: 000000000000000f 0 NOTYPE LOCAL DEFAULT 1 _header_BAR 9: 000000000000000f 0 NOTYPE LOCAL DEFAULT 1 $d 10: 000000000000001a 0 NOTYPE LOCAL DEFAULT 1 code_BAR 11: 000000000000001a 0 NOTYPE LOCAL DEFAULT 1 $x 12: 000000000000001e 0 NOTYPE LOCAL DEFAULT 1 _header_BAZ 13: 000000000000001e 0 NOTYPE LOCAL DEFAULT 1 $d 14: 0000000000000029 0 NOTYPE LOCAL DEFAULT 1 $x 15: 0000000000000000 0 SECTION LOCAL DEFAULT 5 .riscv.attributes 16: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND backlink -- You are receiving this mail because: You are on the CC list for the bug.