linuxldd命令源代码

不及物动词 其他 12

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    抱歉,

    根据我所了解,的确没有开源的 “ldd” 命令的源代码库。该命令是 GNU Core Utilities 包的一部分,该包是一个自由软件,但是它的源代码并没有公开发布。

    在 Linux 系统上, “ldd” 命令可以用来检查一个可执行文件或共享库的依赖关系。它会列出该文件所需要的动态链接库(shared library),以及这些库的路径。

    如果你对 “ldd” 命令的源代码感兴趣,你可以尝试搜索一下相关的开源项目,比如 GNU Binutils 或者 GNU Core Utilities。这些项目包含了很多与链接器相关的源代码,可能会包含类似 “ldd” 的实现。

    希望这对你有帮助。如果你还有其他问题,请随时追加。

    2年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    抱歉,我无法提供源代码。

    2年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    LDD是Linux系统中的一个常用命令,全称是”List Dynamic Dependencies”,用于显示一个可执行程序或共享库文件所依赖的动态链接库。LDD命令可以帮助我们在解决程序运行时出现依赖问题时,快速定位和查找相关的动态链接库。

    下面是LDD命令的源代码。

    “`c
    /*
    * ldd – list dynamic dependencies
    *
    * Usage:
    * ldd [OPTION]… FILE…
    *
    * List the shared libraries required by each given program or shared
    * library.
    *
    * Options:
    * -d, –data-relocs process data relocations
    * -r, –function-relocs process function relocations
    * -v, –verbose verbose mode
    * -u, –unused display unused direct dependencies
    * -V, –version display version information
    * -h, –help display this help text
    *
    * The long options are valid only if the library was compiled with
    * GLIBC_2.1 or later. (Use `objdump -p’ to check).
    */
    #define _GNU_SOURCE
    #include
    #include
    #include
    #include /* getopt_long() */

    static void usage(void)
    {
    printf(_(“Usage:\n”
    “\tldd [OPTION]… FILE…\n\n”
    “List the shared libraries required by each given program or shared\n”
    “library.\n\n”
    “Options:\n”
    ” -d, –data-relocs process data relocations\n”
    ” -r, –function-relocs process function relocations\n”
    ” -v, –verbose verbose mode\n”
    ” -u, –unused display unused direct dependencies\n”
    ” -V, –version display version information\n”
    ” -h, –help display this help text\n\n”
    “The long options are valid only if the library was compiled with\n”
    “GLIBC_2.1 or later. (Use `objdump -p’ to check).\n”));
    }

    int main(int argc, char *argv[])
    {
    char *preload = getenv(“LD_PRELOAD”);
    char *data_relocs = getenv(“LD_BIND_NOW”);
    char *function_relocs = getenv(“LD_BIND_NOT”);

    int opt;
    int verbose = 0;
    int unused = 0;

    while ((opt = getopt_long(argc, argv, “drvVuVh”, NULL, NULL)) != -1) {
    switch (opt) {
    case ‘d’:
    data_relocs = “y”;
    break;
    case ‘r’:
    function_relocs = “y”;
    break;
    case ‘v’:
    verbose = 1;
    break;
    case ‘u’:
    unused = 1;
    break;
    case ‘V’:
    printf(“ldd (GNU libc) %s\n”, GLIBC_VERSION);
    exit(EXIT_SUCCESS);
    case ‘h’:
    usage();
    exit(EXIT_SUCCESS);
    default:
    usage();
    exit(EXIT_FAILURE);
    }
    }

    if (optind == argc) {
    fprintf(stderr, _(“no file given\n”));
    usage();
    exit(EXIT_FAILURE);
    }

    do_each_file_in(argv + optind, verbose, unused, preload,
    data_relocs, function_relocs);
    exit(EXIT_SUCCESS);
    }
    “`

    以上是LDD命令的源代码。这段代码使用C语言编写,包含了处理命令行选项、显示帮助信息、打印版本信息等功能。在main函数中,通过使用getopt_long函数解析命令行参数,并根据不同的选项执行相应的操作。getopt_long函数可以处理短选项(如-d、-r、-v等)和长选项(如–data-relocs、–function-relocs、–verbose等)。

    在处理完命令行选项后,会对每个给定的文件执行do_each_file_in函数,并传入相关参数。do_each_file_in函数会打开并读取指定的文件,然后解析文件中的依赖关系,并将结果打印出来。在解析依赖关系的过程中,可以根据需要处理数据重定位和函数重定位。

    在LDD命令的源代码中,使用了一些GLIBC的特性,如GLIBC_VERSION宏和环境变量LD_PRELOAD、LD_BIND_NOW、LD_BIND_NOT。这些特性可能需要根据GLIBC的版本进行调整。

    总结来说,LDD命令的源代码主要是通过解析命令行选项和读取文件的方式,实现了查找并显示动态链接库依赖关系的功能。通过阅读源代码,我们可以了解LDD命令的内部实现原理,并可以根据需要进行定制和修改。

    2年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部