相关疑难解决方法(0)

将某些编译器生成的变量强制转换为特定的ELF节(使用gcc)

我将从最终的问题开始:在C中使用gcc,是否可以获得__func__(或等效地__FUNCTION__)存储在除.rodata(或其中任何-mrodata=点)或子部分之外的部分的值(?)?

完整的解释:

假设我有一个记录宏:

#define LOG(fmt, ...) log_internal(__FILE__, __LINE__, __func__, fmt, ##__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

(##当且仅当__VA_ARGS__列表为空时,在该一元上下文中使用的字符串连接运算符使用前面的逗号,从而允许使用带或不带参数的格式字符串.)

然后我可以正常使用宏:

void my_function(void) {
    LOG("foo!");
    LOG("bar: %p", &bar);
}
Run Code Online (Sandbox Code Playgroud)

可能打印(显然取决于实施log_internal):

foo.c:201(my_function) foo!
foo.c:202(my_function) bar: 0x12345678
Run Code Online (Sandbox Code Playgroud)

在这种情况下,格式字符串("foo""bar: %p")和预处理程序字符串("foo.c""my_function")是匿名只读数据,它们会.rodata自动放入该部分.

但是我说他希望他们去另一个地方(我在一个嵌入式平台上运行几乎所有来自RAM的速度,但内存限制正在推动将一些东西转移到ROM中).移动__FILE__和格式字符串"简单" :

#define ROM_STR(str) (__extension__({static const __attribute__((__section__(".rom_data"))) char __c[] = (str); (const char *)&__c;}))
#define LOG(fmt, ...) log_internal(ROM_STR(__FILE__), __LINE__, __func__, ROM_STR(fmt), ##__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

你不能放一个__attribute__匿名字符串,所以 …

c linker gcc elf

11
推荐指数
1
解决办法
4152
查看次数

标签 统计

c ×1

elf ×1

gcc ×1

linker ×1