我希望能够在汇编程序文件中定义一个符号,其中包含任何不包含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'
答案 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可能无法做到这一点。