【问题标题】:Check library built flags or options (-frecord-gcc-switches)检查库构建的标志或选项(-frecord-gcc-switches)
【发布时间】:2020-05-26 16:06:48
【问题描述】:

我想检查正在调查的库是用什么标志和选项构建的?

我正在尝试使用带有选项 -frecord-gcc-switches 的 gcc 编译器来理解我的简单共享库,但没有运气。

以下是构成共享库的一段代码:

#include "shared.h"
unsigned int add(unsigned int a, unsigned int b)
{
    printf("\n Inside add()\n");
    return (a+b);
}

shared.h 看起来像:

#include<stdio.h>
extern unsigned int add(unsigned int a, unsigned int b);

我运行以下命令来创建一个共享库:

gcc -c -Wall -Werror -fPIC -frecord-gcc-switches shared.c
gcc -shared -frecord-gcc-switches -o libshared.so shared.o

readelf -n libshared.so 给了我

Displaying notes found in: .note.gnu.build-id
  Owner                 Data size       Description
  GNU                  0x00000014       NT_GNU_BUILD_ID (unique build ID bitstring)
    Build ID: 8466741f5849aac95570ec68d172f9077f175f89

如何检查使用了哪些选项/标志或其他库来构建生成的库?

顺便说一句,我使用

$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

【问题讨论】:

    标签: linux gcc dynamic-library


    【解决方案1】:

    选项-frecord-gcc-switches只在编译时有效, 不在链接中,因此您可以从以下位置省略它:

    $ gcc -shared -frecord-gcc-switches -o libshared.so shared.o
    

    至少在 ELF 目标文件中,编译选项被写成一个列表 将字符串放入名为.GCC.command.line 的目标文件部分。默认 编译选项也会被记录下来。

    如果包含此部分的多个目标文件链接到 共享库或程序然后所有输入.GCC.command.line 部分合并为一个同名的输出部分, 显然是对字符串进行了重复数据删除。所以如果不同的来源 文件是用不同的选项编译的,应用的选项 每个源文件可能并不明显。

    要从libshared.so 检索记录的选项,请运行:

    $ readelf --string-dump=.GCC.command.line libshared.so
    

    输出将类似于:

    String dump of section '.GCC.command.line':
      [     0]  -I .
      [     5]  -imultiarch x86_64-linux-gnu
      [    22]  -D_GNU_SOURCE
      [    30]  file1.cpp
      [    3a]  -mtune=generic
      [    49]  -march=x86-64
      [    57]  -Wextra
      [    5f]  -frecord-gcc-switches
      [    75]  -fasynchronous-unwind-tables
      [    92]  -fstack-protector-strong
      [    ab]  -Wformat
      [    b4]  -Wformat-security
      [    c6]  -fstack-clash-protection
      [    df]  -fcf-protection
      [    ef]  file2.cpp
      [    f9]  file3.cpp
      [   103]  -Wpedantic
    

    由于链接不会向此信息添加任何内容,因此更有意义的是 直接从目标文件而不是程序中检索它或 它们链接到的共享库:

    $ readelf --string-dump=.GCC.command.line file.o
    

    从那以后就不会弄错哪个编译了 记录选项参考。

    请注意the manual中的这一警告

    此开关仅在某些目标上实现,并且 录制取决于目标和二进制文件格式

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 2010-12-21
      • 2011-07-14
      • 2020-06-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多