如何在汇编程序中创建具有奇怪名称的符号?
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.
可能是不可能的
我希望能够在汇编程序文件中使用不包含 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.
可能是不可能的