-W编译选项用于生成警告信息,常用的是-Wall,表示生成所有警告信息,但其实这个选项是可以跟具体参数的,跟上具体参数时表示生成或禁止某类警告信息,比如-Wunused-variable表示生成变量已定义但未使用警告,而如果要禁止生成该类警告,则使用-Wno-,比如-Wno-unused-variable表示禁止生成变量未使用警告。
-W<letter>和-Wno-<letter>的形式也适用于-f开头的选项,比如-fomit-frame-pointer和-fno-omit-frame-pointer,以及-fsigned-char和-fno-signed-char。
-Wno 系列的编译选项文档说明:https://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Warning-Options.html
关于GNU特性测试宏(Feature Test Macros)与dladdr的使用
#define _GNU_SOURCE #include <dlfcn.h> #include <stdio.h> #include <string.h> int func(int a, int b) { Dl_info info; memset(&info, 0, sizeof(info)); // void *pc = 0; // __asm__( // "mov %0, pc\n" // : "=r"(pc) // : // :); // printf("pc:%p\n", pc); // dladdr(pc, &info); dladdr(func, &info); if (info.dli_fname && info.dli_saddr) { printf("dli_fname:%s\n", info.dli_fname); printf("dli_fbase:%p\n", info.dli_fbase); printf("dli_sname:%s\n", info.dli_sname); printf("dli_saddr:%p\n", info.dli_saddr); } return 0; } int main() { Dl_info info; memset(&info, 0, sizeof(info)); dladdr(main, &info); if (info.dli_fname && info.dli_saddr) { printf("dli_fname:%s\n", info.dli_fname); printf("dli_fbase:%p\n", info.dli_fbase); printf("dli_sname:%s\n", info.dli_sname); printf("dli_saddr:%p\n", info.dli_saddr); } func(1, 2); return 0; } |
上面的代码,_GNU_SOURCE只能放在开头,否则编译会报错。
要想通过dladdr获取符号的名称和地址,必须在编译时加入-rdynamic链接选项,表示把所有符号(而不仅仅只是程序已使用到的外部符号)都添加到动态符号表(即.dynsym表)里,以便那些通过 dlopen() 或 backtrace() (这一系列函数使用.dynsym表内符号)这样的函数使用。
编译时指定运行时动态库的搜索路径: -Wl,-rpath=.
指定系统搜索动态库的路径:LD_LIBRARY_PATH /etc/ld.so.conf