Tag: 符号

在Linux体系结构中使用C代码动态列出所有函数/符号?

假设main.c使用来自main.c声明的共享库和本地函数的符号。 是否有一种漂亮而优雅的方式在运行时打印所有可用function名称和符号的列表? 应该可以,因为数据被加载到.code段。

为什么非extern可以在C / C ++中的.h文件中?

以此文件为例,有许多非外部结构,如: struct list_head source_list; 当多个编译单元包含此头文件时,它如何工作? 应该有错误报告,相同的符号被定义两次,对吗?

在链接期间,库中的弱符号可以解决吗?

我的场景是关于交叉编译到Arduino Due(ARM目标),但我想这是一个通用的C弱符号问题。 我想将我的固件分成3个部分:1。硬件库(CMSIS,中间件) – > libHardware.a 2.实时操作系统库 – > libOS.a 3.应用程序代码 – > Output.elf链接到上面。 引用的CMSIS实现已声明如下: void SysTick_Handler ( void ) __attribute__ ((weak, alias(“Dummy_Handler”))); // …and a few dozen IRQ handler hook skipped for brevity CMSIS设计的想法是让应用程序代码有选择地实现和处理一些IRQ。 nm报告了libHardware.a startup_sam3xa.o: 00000000 W SysTick_Handler … 在我的场景中,我想在libOS.a中实现这些IRQ处理程序。 我实现了void SysTick_Handler(void),nm报告: cortex_handlers.o: 00000000 T SysTick_Handler …. 然后我将它们连接在一起,这基本上归结为 g++ -o app.elf -Wl,–start-group app.o […]

将转到标签暴露给符号表

我想知道是否可以将函数中的goto标签暴露给C / C ++中的符号表 例如,我想从符号表中生成以下代码段的ret标签,并且可以使用标准API(如dlsym())进行引用。 感谢您的帮助! #include int main () { void *ret_p = &&ret; printf(“ret: %p\n”, ret_p); goto *ret_p; return 1; ret: return 0; }

在编译时重命名符号,而不以跨平台方式更改代码

在创建静态对象时,是否可以在跨平台的方式在编译时重命名符号(不更改代码)? 我最近推荐使用objcopy,但linux并不是唯一一个必须在mac上工作的目标平台。 我正在使用gcc编译,所以我希望有某种gcc选项。 我听说过.def文件,但这可能会产生误导,因为我发现的有关它们的信息似乎是针对Windows的。 编辑:我正在尝试更改C和Fortran函数的名称,特别是使用“wrap”一词预先挂起它们,以避免链接时出现符号冲突。

unsigned和unsigned int之间有区别吗

在C中, unsigned作为直接类型和unsigned int之间有区别吗? 更新:这是这个问题的重复,但另一个问题没有回答可能存在的小问题。 感谢@EOF指出了位域中实现定义的行为。

在C中将符号扩展名从16位扩展到32位

我必须为16位整数做一个符号扩展,由于某种原因,它似乎没有正常工作。 谁能告诉我代码中的bug在哪里? 我已经工作了几个小时。 int signExtension(int instr) { int value = (0x0000FFFF & instr); int mask = 0x00008000; int sign = (mask & instr) >> 15; if (sign == 1) value += 0xFFFF0000; return value; } 指令(instr)是32位,在里面我有一个16位的数字。

为什么GDB启动一个新shell以及如何禁用此行为?

我正在弄清楚一个问题,从GDB启动应用程序会导致符号查找错误,但从shell启动它的工作原理。 事实certificate,无论何时从GDB内部启动程序,它都会启动一个新的shell,从而覆盖我在启动GDB之前设置的所有环境变量(如LD_LIBRARY_PATH )。 这不是我想要的行为。 有人可以解释这背后的理由,或者告诉我如何解决这个问题?

手动指定特定链接符号的重新映射

如果不修改这两个源文件,有没有办法通过编译它们来获取生成的目标文件,并说服链接器将main_v1.c中的foo链接到bar.c中的bar ? main_v1.c void foo(void); int main(void) { foo(); } bar.c #include void bar(void) { puts(“bar()!”); } 修改目标文件本身是公平的游戏,但假设我们甚至可能没有可用的源代码。 该平台是Linux。 通过坚持对main_v1.c的适度更改,并链接到一个额外的“映射”对象文件,这里几乎可以用标准C获得所需的结果。 main_v2.c extern void (*const foo)(void); int main(void) { foo(); } bar.c没有变化。 map.c void bar(void); void (*const foo)(void) = bar; 如果使用lto编译目标文件,则甚至可以省略函数指针取消引用(使用最近的gcc)。 这是一个非常好的结果但是如果修改main()以直接调用bar() ,那么bar()本身在链接后内联,因此还有改进的余地。

dyld:惰性符号绑定失败:找不到符号 – nm报告找到符号

这里有一个相当抽象的问题,因为我不知道从哪里开始自己的调查。 我有一个用CMake构造的C包,它生成librpdb.so; 我为同一个库设置了一个Ruby Gem,它生成了rpdb.bundle。 在Ruby中使用时,我得到了这个: dyld: lazy symbol binding failed: Symbol not found: _RPDB_RuntimeStorageController_sharedInstance Referenced from: /usr/local/lib/ruby/gems/1.9.1/gems/rpdb-0.1.0/lib/rpdb/rpdb.bundle Expected in: flat namespace 当我查看图书馆时,nm会报告: 000000000000ea40 T _RPDB_RuntimeStorageController_sharedInstance 因此看起来符号确实在库中。 那么,为什么绑定会失败呢?