私は、特別なセクション(__dlog
)に文字列を格納することによってELF実行可能ファイルにメタデータを追加しようとしています。現在のアプローチでは、文字列を格納するためにインラインアセンブリを使用し(乱用する)、ほぼ必要に応じて動作します。インラインアセンブリで__func__を使用する方法
#include <stdio.h>
#include <stdlib.h>
#define DLOG(proto...) \
__asm__(".pushsection __dlog, \"S\", @note\n\t" \
".asciz \"" __FILE__ ":function_name_here:" #proto "\"\n\t" \
".popsection\n\t")
int
foo(int bar)
{
int baz = bar/2;
DLOG(int baz);
return baz;
}
int
main(int argc, char *argv[])
{
foo(argc);
return EXIT_SUCCESS;
}
しかし、理想的には、マクロが自動的に__func__
識別子を利用することによって、文字列の一部として、関数名を含める必要があります。最終結果は、__dlog
という部分に文字列
file.c:foo:int baz\0
とする必要があります。 __func__
は文字列リテラルではありませんので、しかし、GCCは__func__
の内容を文字列に追加取得するにはとにかくがあります。このコード
".asciz \"" __FILE__ ":" __func__ ":" #proto "\"\n\t"
と不平を言いますか?ソリューションがカスタムビルドオプションや後処理ステップを必要としない場合のボーナスポイント。コンパイラはgcc 4.4と4.5です。
上の最後の段落を参照してください。 – user562374
@userが動作しません。とにかく 'printf("%s \ n "、__ func __)'は、(関数が 'extern" C "'なので)名前のない名前を表示します。名前を変更しているのはアセンブラです。おそらくそれがdllだった場合(したがって、輸出されたシンボルを保存しなければならない) – KitsuneYMG
nope。 '--shared'は問題を解決しません – KitsuneYMG