如何在汇编程序中创建具有奇怪名称的符号?

How to create symbols with weird names in assembler?

我希望能够在汇编程序文件中使用不包含 NUL 字符的任何名称定义一个符号。我如何让 GNU 汇编器创建这样的符号? NASM 呢? MASM?

编辑:我正在使用以下 Python 脚本进行测试(需要 Python 3.5.1+):

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import tempfile
import os.path
import subprocess
import ctypes

def main(symbolname, quoter):
    join = os.path.join
    with tempfile.TemporaryDirectory() as d:
        as_file_name = join(d, 'test.s')
        with open(as_file_name, 'w') as file_object:
            assembler = '''\
\t.globl "{0}"
"{0}":
\tmov [=10=]x0, %rdi # exit status
\tmov 1, %rax # __NR_exit_group
\tsyscall
'''.format(quoter(symbolname))
            file_object.write(assembler)
        objectname, sharedlib = join(d, 'test.o'), join(d, 'test.so')
        subprocess.check_call(['as', '-o', objectname, as_file_name])
        subprocess.check_call(['ld', objectname, '-shared', '-o', sharedlib])
        mydll = ctypes.pydll.LoadLibrary(sharedlib)
        mydll[symbolname]
if __name__ == '__main__':
    main('a', lambda x: x)

我想弄清楚我可以用什么代替传递给 main 的恒等函数,这样代码就可以用我输入的任何字符串代替 'a'

在 GAS 中为我​​工作:.comm "my weirdsym .$ 12 foo^M bar" 2(其中 ^M 是字面上的回车 return,并使 objdump -t 的输出看起来很有趣)。

使用 label: 语法创建此类符号可能并不总是可行的。 GAS 手册在 the statement syntax 的描述中没有提到引用的标签名称,它对我不起作用: test.S:52: Error: junk at end of line, first unrecognized character is '"' 输入 "foobar":.

如果你真的想要这个,你可以使用 .set 来获得一个需要符号名称的上下文,这样你就可以使用引号。然后你可以给一个符号任何你想要的值,包括另一个符号的值(例如一个合理命名的标签)。

例如(感谢@FUZxxl):

# symbol includes a literal doublequote, and a literal newline
# symbol value(address) is . which means current position 
.set "\"my weirdsym .$ 12 foo^M bar", .
    nop                                                                                                                                                          

objdump -drwC -Mintel 输出:

 bar>:00000000a7 <"my weirdsym .$ 12 foo
  a7:   90                      nop

我强烈建议对代码中的符号名称进行一些健全性检查,因为创建带有不可打印字符的符号名称可能不是很有帮助(对于任何调试目标文件的人)。

将事物编码为对 C function/variable 名称合法的字符的自定义名称修改方案也可以工作。

但如果您真的想要这样做,这就是(使用 GAS)的方法。 NASM.

可能是不可能的