2016-11-01 12 views
1

NUL文字を含まない名前のアセンブラファイルにシンボルを定義したいと考えています。どのようにGNUアセンブラでそのようなシンボルを作成するのですか? NASMはどうですか? MASM?アセンブラで奇妙な名前のシンボルを作成するには?

編集:私はテストのために次の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に渡されたアイデンティティ機能の代わりに置くことができるかを把握しようとしています.comm "my weirdsym .$ 12 foo^M bar" 2(それは^ Mリテラルキャリッジリターンである、とobjdump -tの出力は面白いに見える場所):コードは、私はガス中の私にとって'a'

+1

マニュアルを読むのはいかがですか? [gas](https://sourceware.org/binutils/docs/as/Symbol-Intro.html)の場合は、次のようになります。_シンボル名は二重引用符で囲むこともできます。そのような場合、NUL文字以外の文字は許可されています。 "_ – Jester

+0

@Jester残念ながら、私のテストではこれはうまくいかないと表示されています – Demi

+0

とにかく「nasm」はまた、あなたのリンカがうまくいかないかもしれません.C++ネームのマングリングが存在する理由があります) – Jester

答えて

4

作品の代わりに置かれたあらゆる文字列に動作するように。

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では不可能です。

+1

ラベルの代わりに、' .set symbol、.'を使うことができます。 – fuz

関連する問題