You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下替代GetModuleFileName:dladdr的X参数如何确定及使用?

Linux下实现Windows的GetModuleFileName(NULL)功能

Windows中GetModuleFileName(0, buf, buf_size)的作用是获取当前进程自身可执行文件的完整路径,在Linux下可以通过dladdr实现类似效果,也有更直接的替代方案,下面分别说明:

用dladdr实现的方法

dladdr需要传入一个属于当前可执行文件的内存地址,它会定位该地址所属模块(可执行文件或动态库)的信息。你可以用当前函数自身的地址、main函数的地址,或者编译器内置的__builtin_return_address(0)(获取当前函数调用者的地址,同样属于当前进程)作为参数X。

示例代码

#include <stdio.h>
#include <dlfcn.h>
#include <string.h>

int get_self_exe_path(char* buf, size_t buf_size) {
    Dl_info dl_info;
    // 传入当前函数的地址给dladdr
    if (dladdr((void*)&get_self_exe_path, &dl_info) == 0) {
        fprintf(stderr, "dladdr执行失败: %s\n", dlerror());
        return -1;
    }

    // 检查缓冲区容量并拷贝路径
    if (strlen(dl_info.dli_fname) >= buf_size) {
        fprintf(stderr, "缓冲区空间不足\n");
        return -1;
    }
    strcpy(buf, dl_info.dli_fname);
    return 0;
}

int main() {
    char path[1024];
    if (get_self_exe_path(path, sizeof(path)) == 0) {
        printf("当前可执行文件路径: %s\n", path);
    }
    return 0;
}

编译注意事项

编译时需要链接动态链接库,添加-ldl选项:

gcc your_code.c -o your_program -ldl

更直接的替代方案:读取/proc/self/exe

Linux下/proc/self/exe是指向当前进程可执行文件的符号链接,直接读取该链接的目标路径更简单,无需依赖dladdr:

示例代码

#include <stdio.h>
#include <unistd.h>

int get_self_exe_path(char* buf, size_t buf_size) {
    ssize_t len = readlink("/proc/self/exe", buf, buf_size - 1);
    if (len == -1) {
        perror("readlink执行失败");
        return -1;
    }
    buf[len] = '\0'; // 手动添加字符串结束符
    return 0;
}

int main() {
    char path[1024];
    if (get_self_exe_path(path, sizeof(path)) == 0) {
        printf("当前可执行文件路径: %s\n", path);
    }
    return 0;
}

这个方法无需额外链接库,兼容性更强,静态编译的程序也能正常使用。

内容的提问来源于stack exchange,提问作者user3443063

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:20:18