-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


  • 无标签