如何将 __func__ 与内联汇编一起使用
我试图通过将字符串存储在特殊部分 (__dlog
) 中来将元数据添加到 ELF 可执行文件中。当前的方法使用(滥用?)内联汇编来存储字符串并且几乎可以按预期工作。
#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__ 标识符自动将函数名称作为字符串的一部分包含在内。 字符串
file.c:foo:int baz\0
最终结果应该是名为 __dlog
的部分中的 。但由于 __func__
不是字符串文字,gcc 会抱怨这段代码
".asciz \"" __FILE__ ":" __func__ ":" #proto "\"\n\t"
是否有办法将 __func__
的内容添加到字符串中?如果解决方案不需要自定义构建选项或后处理步骤,则可加分。编译器是 gcc 4.4 和 4.5。
I'm trying to add meta-data to an ELF executable by storing strings in a special section (__dlog
). The current approach uses (abuses?) inline assembly to store the strings and nearly works as desired.
#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;
}
But ideally, the macro should automatically include the function name as a part of the string by taking advantage of the __func__
identifier. The end result should be the string
file.c:foo:int baz\0
in a section called __dlog
. But since __func__
is not a string literal, gcc complains with this code
".asciz \"" __FILE__ ":" __func__ ":" #proto "\"\n\t"
Is there anyway to get the contents of __func__
added to the string? Bonus points if the solution doesn't require custom build options or post-processing steps. Compiler is gcc 4.4 and 4.5.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
编辑:这似乎有效,它没有给出完全未损坏的名称,但函数名称在那里
g++-4.4 test.cpp && xxd a.out | xxd less -p test.cpp
原始答案:
在使用 c 模式的 gcc-3.3 中,
__func__
被视为const char []
。如果是c++模式,并且在gcc中> 3.3、__func__
始终是一个变量。我想你可以在 c 模式下使用旧版本的 gcc 来完成此任务。
请参阅 http://gcc.gnu.org/onlinedocs/gcc/ 的最后一段函数名称.html
Edit: This seems to work, it doesn't give a completely un-mangled name, but the function name is there
g++-4.4 test.cpp && xxd a.out | less -p test.cpp
Original Answer:
In gcc-3.3 using c mode,
__func__
is treated like aconst char []
. If c++ mode, and in gcc > 3.3,__func__
is always a variable.I guess you could use an older version of gcc, in c-mode, to accomplish this.
See the last paragraph on http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html