【问题标题】:How to know the location of a function being compiled by the compiler如何知道编译器正在编译的函数的位置
【发布时间】:2012-05-27 10:37:33
【问题描述】:

我正在尝试修改 glibc 以用于我的程序。我想向 mmap 函数添加一些代码(不是 mmap 系统调用,而是 glibc 中执行 mmap 系统调用的函数)。但是,我在源代码目录中看到了几个 mmap 或 mmap64.c 文件。

我的架构是 x86-64,所以我忽略了其他架构目录中的文件。但是,我不知道编译器使用的是哪个文件的 mmap。我故意在包含 mmap 函数的不同文件中插入了一些垃圾代码(这样编译器会出错),但是编译器可以很好地编译 glibc 而不给出任何错误。我什至可以看到创建的 .o 文件。我不知道该做什么知道。有什么简单的方法可以确定编译器正在编译哪个 mmap?

【问题讨论】:

    标签: c linux gcc x86-64 glibc


    【解决方案1】:

    有什么简单的方法可以确定编译器正在编译哪个 mmap?

    gdb -q libc.so.6
    
    Reading symbols from /tmp/build/libc.so.6...done.
    (gdb) list mmap
    76  #else
    77  
    78  /* This is a "normal" system call stub: if there is an error,
    79     it returns -1 and sets errno.  */
    80  
    81  T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
    82      ret
    83  T_PSEUDO_END (SYSCALL_SYMBOL)
    84  
    85  #endif
    (gdb) info source
    Current source file is ../sysdeps/unix/syscall-template.S
    Compilation directory is /glibc-git-rw/glibc/misc
    Located in /glibc-git-rw/glibc/sysdeps/unix/syscall-template.S <<< You want this
    Contains 87 lines.
    Source language is asm.
    Compiled with DWARF 2 debugging format.
    Does not include preprocessor macro info.
    

    【讨论】:

    • 当我输入 list mmap 时,gdb 说没有加载符号表。使用文件命令。
    • @user1018562 "未加载符号表" -- 不要在已安装的 libc.so.6 上运行 GDB(它没有调试信息)。在刚刚构建的副本上运行它。
    • 好吧,我用 -O2 优化编译。我想我应该通过 -g 标志并且不为此进行优化。对吗?
    • @user1018562 glibc 通常使用-O2 -g 标志构建。你应该搞乱标志。
    • 好的,但现在它显示“No line number known for mmap”
    【解决方案2】:

    可能有一些链接器 (ld) 选项可能对您有所帮助。查看ld 手册页,--print-map 或--trace 或--trace-symbol 应该对您有所帮助。一旦你得到目标文件,那么你应该能够找到相应的头文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 2013-07-10
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多