版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

-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表内符号)这样的函数使用。