Dem*_*emi 2 assembly masm gnu-assembler nasm
我希望能够在汇编程序文件中定义一个不包含 NUL 字符的任何名称的符号。我如何让 GNU 汇编器创建这样的符号?NASM 怎么样?玛斯姆?
编辑:我使用以下 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)
Run Code Online (Sandbox Code Playgroud)
我试图弄清楚我可以输入什么而不是传递给的身份函数main,以便代码可以工作我输入的任何字符串而不是'a'
在 GAS 中为我工作:(.comm "my weirdsym .$ 12 foo^M bar" 2其中 ^M 是字面回车符,并使 的输出objdump -t看起来很有趣)。
使用语法创建此类符号label:可能并不总是可行。GAS 手册在语句语法的描述中没有提到引用的标签名称,它对我不起作用:
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
Run Code Online (Sandbox Code Playgroud)
objdump -drwC -Mintel输出:
bar>:00000000a7 <"my weirdsym .$ 12 foo
a7: 90 nop
Run Code Online (Sandbox Code Playgroud)
我强烈建议对代码中的符号名称进行一些健全性检查,因为创建具有不可打印字符的符号名称可能不是很有帮助(对于任何调试目标文件的人)。
将事物编码为对 C 函数/变量名称合法的字符的自定义名称修饰方案也可以工作。
但如果你真的想这样做,这就是方法(使用 GAS)。对于 NASM 来说这可能是不可能的。