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

时间:2016-11-01 01:27:31

标签: assembly nasm masm gas

我希望能够在汇编程序文件中定义一个符号,其中包含任何不包含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 $0x0, %rdi # exit status
\tmov $231, %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'

1 个答案:

答案 0 :(得分:4)

在GAS中为我工作:.comm "my weirdsym .$ 12 foo^M bar" 2(其中^ M是文字回车,并使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函数/变量名称合法的字符的自定义名称修改方案也可以使用。

但如果真的想要这样做,那就是(使用GAS)。 NASM可能无法做到这一点。