精华内容
下载资源
问答
  • Linux命令学习手册-objcopy命令
    2021-05-11 10:55:07

    objcopy [选项]... 输入文件 [输出文件]

    [功能]

    将目标文件的一部分或者全部内容拷贝到另外一个目标文件中,或者实现目标文件的格式转换。

    [描述]

    objcopy工具使用BFD库读写目标文件,它可以将一个目标文件的内容拷贝到另外一个目标文件当中。objcopy通过它的选项来控制其不同的动作,它可以将目标文件拷贝成和原来的文件不一样的格式。需要注意的是objcopy能够在两种格式之间拷贝一个完全链接的文件,在两种格式之间拷贝一个可重定位的目标文件可能不会正常地工作。

    objcopy在做转换的时候会创建临时文件,然后将这些临时文件删除。objcopy使用BFD来做它所有的转换工作;它访问BFD中描述的所有格式,可以不必指定就识别大多数的格式。

    通过指定输出目标为srec(例如 -O srec),objcopy可以用来生成S-record文件。

    通过指定输入目标为而进制文件(例如-O binary),objcopy可以生成原始格式的二进制文件。当objcopy生成一个原始格式的二进制文件的时候,它会生成输入的目标文件的基本内存拷贝,然后所有的标号和可重定位信息都会被去掉。内存拷贝开始于最低段的加载地址,拷贝到输出文件。

    当生成一个S-record或者原始的二进制文件的时候,可以使用-S这个很有用的选项选项来移除一些包含调试信息的节。有时-R可以用来移除一些二进制文件不需要的节。

    注意:objcopy工具不能用来改变文件的大端和小端属性。

    命令参数:

    infile/outfile

    源文件/目标文件,如果不指定目标文件那么objcopy将会创建一个临时文件,并且将其命名为源文件。

    命令项:

    -I bfdname

    --input-target=bfdname

    指定输入文件的bfdname,可取值elf32-little,elf32-big等。

    -O bfdname

    --output-target=bfdname

    指定输出文件的bfdname

    -F bfdname

    --target=bfdname

    指定输入、输出文件的bfdname,目标文件格式,只用于在目标和源之间传输数据,不转换。

    -j sectionname

    --only-section=sectionname

    只将由sectionname指定的section拷贝到输出文件,可以多次指定,并且注意如果使用不当会导致输出文件不可用。

    -R sectionname

    --remove-section=sectionname

    从输出文件中去除掉由sectionname指定的section,可以多次指定,并且注意如果使用不当会导致输出文件不可用。

    -S

    --strip-all

    不从源文件拷贝符号信息和relocation信息。

    -g

    --strip-debug

    不从源文件拷贝调试符号信息和相关的段。对使用-g编译生成的可执行文件执行之后,生成的结果几乎和不用-g进行编译生成可执行文件一样。

    --strip-unneeded

    去掉所重定位处理不需要的符号。

    -K symbolname

    --keep-symbol=symbolname

    strip的时候,保留由symbolname指定的符号信息。可以指定多次。

    -N symbolname

    --strip-symbol=symbolname

    不拷贝由symbolname指定的符号信息,可以多次指定。

    -G symbolname

    --keep-global-symbol=symbolname

    只保留symbolname为全局的,让其他的都是文件局部的变量这样外部不可见,这个选项可以多次指定。

    -L symbolname

    --localize-symbol=symbolname

    将变量symbolname变成文件局部的变量。可以多次指定。

    -W symbolname

    --weaken-symbol=symbolname

    弱化变量。

    --globalize-symbol=symbolname

    让变量symbolname变成全局范围,这样它可以在定义它的文件外部可见。可以多次指定。

    -w

    --wildcard

    允许对其他命令行项中的symbolnames使用正则表达式。问号(?),星号(*),反斜线(\),和中括号([])操作可以用在标号名称的任何位置。如果标号的第一个字符是感叹号(!),那么表示相反的含义,例如:

    -w -W !foo -W fo*

    表示objcopy将要弱化所有以"fo"开头的标号,但是除了标号"foo"。

    -x

    --discard-all

    不从源文件中拷贝非全局变量。

    -X

    --discard-locals

    不拷贝编译生成的局部变量(一般以L或者..开头)。

    -b byte

    --byte=byte

    只保留输入文件的每个第byte个字节(不会影响头部数据)。byte的范围可以是0到interleave-1。这里,interleave通过-i选项指定,默认为4。将文件创建成程序rom的时候,这个命令很有用。它经常用于srec输出目标。

    -i interleave

    --interleave=interleave

    每隔interleave字节拷贝1 byte。通过-b选项指定选择哪个字节,默认为4。如果不指定-b那么objcopy会忽略这个选项。

    --gap-fill val

    在section之间的空隙中填充val,

    --set-start val

    设定新文件的起始地址为val,并不是所有格式的目标文件都支持设置起始地址。

    --change-start incr

    --adjust-start incr

    通过增加incr量来调整起始地址,并不是所有格式的目标文件都支持设置起始地址。

    --change-address incr

    --adjust-vma incr

    通过增加incr量调整所有sections的VMA(virtual memory address)和LMA(linear memory address),以及起始地址。

    --change-section-address section{=,+,-}val

    --adjust-section-vma section{=,+,-}val

    调整指定section的VMA/LMA地址。

    --set-section-flags section=flag

    指定指定section的flag,flag的取值可以alloc,contents, load, noload, readonly, code, data, rom, share, debug。我们可以设置一个没有内容的节的flag,但是清除一个有内容的节的flag是没有意义的--应当把相应的节移除。并不是所有的flags对于所有的目标文件都有意义。

    --add-section sectionname=filename

    在拷贝文件的时候,添加一个名为sectionname的section,该section的内容为filename的内容,大小为文件大小。这个选项只在那些可以支持任意名称section的文件好用。

    --rename-section oldname=newname[,flags]

    更改section的名

    将一个section的名字从oldname更改为newname,同时也可以指定更改其flags。这个在执行linker脚本进行重命名的时候,并且输出文件还是一个目标文件并不成为可执行的连接文件,这个时候很有优势。

    这个项在输入文件是binary的时候很有用,因为这经常会创建一个名称为.data的section,例如,你想创建一个名称为.rodata的包含二进制数据的section,这时候,你可以使用如下命令:

    objcopy -I binary -O -B \

    --rename-section .data=.rodata,alloc,load,readonly,data,contents \

    --add-gnu-debuglink=path-to-file

    创建一个.gnu_debuglink节,这个节包含一个特定路径的文件引用,并且把它添加到输出文件中。

    --only-keep-debug

    对文件进行strip,移走所有不会被--strip-debug移走的section,并且保持调试相关的section原封不动。

    这个项应该和--add-gnu-debuglink选项一起使用,创建一个两部分的可执行文件。一个是已经被stripped的占用RAM空间以及发布的大小很小的二进制文件,另一个是调试信息文件,这个信息只有在调试的时候会用到。建立这样的两个文件的步骤如下:

    a.像正常那样链接可执行文件,foo

    b.运行"objcopy --only-keep-debug foo foo.dbg"创建一个包含调试信息的文件

    c.运行"objcopy --strip-debug foo"创建一个去掉调试信息的(strip的)可执行文件

    d.运行"objcopy --add-gnu-debuglink=foo.dbg foo",为strip的文件添加调试信息链接。

    注意这里择".dbg"扩展名是任意的,"--only-keep-debug"的步骤也是可选的,你也可以这样做:

    a.像正常那样链接可执行文件,foo

    b.将"foo"拷贝为"foo.full"

    c.运行"objcopy --strip-debug foo"

    d.运行"objcopy --add-gnu-debuglink=foo.full foo"

    可见,使用--add-gnu-debuglink添加调试信息的可以是完全的可执行文件,不用非得用"--only-keep-debug"创建。

    注意 这个只能用于完全链接的文件,对于一个目标文件来说这个功能没有意义,因为调试信息可能不完整。另外,gnu_debuglink特性当前一个包含调试信息的文件,不能多个文件用于每个文件一个目标文件。

    -V

    --version

    显示objcopy的版本号。

    @file 可以将选项集中到一个文件中,然后使用这个@file选项载入。

    [举例]

    a)后面的测试,我们查看采用的源代码如下:

    [root@lv-k cppDemo]# cat main.cpp

    #include

    using std::cout;

    using std::endl;

    void my_print();

    int main(int argc, char *argv[])

    {

    my_print();

    cout<

    return 0;

    }

    void  my_print()

    {

    cout<

    }

    b)对以上源代码进行编译,生成不含调试信息的可执行文件如下:

    [root@lv-k cppDemo]# g++ main.cpp -o main

    c)生成包含调试信息的可执行文件如下:

    [root@lv-k cppDemo]# g++ -g main.cpp -o main.debug

    d)采用"readelf -S main"查看其段信息如下:

    [root@lv-k cppDemo]# readelf -S main

    There are 29 section headers, starting at offset 0xca0:

    Section Headers:

    [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al

    [ 0]                   NULL            00000000 000000 000000 00      0   0  0

    [ 1] .interp           PROGBITS        08048134 000134 000013 00   A  0   0  1

    [ 2] .note.ABI-tag     NOTE            08048148 000148 000020 00   A  0   0  4

    [ 3] .gnu.hash         GNU_HASH        08048168 000168 000030 04   A  4   0  4

    [ 4] .dynsym           DYNSYM          08048198 000198 0000d0 10   A  5   1  4

    [ 5] .dynstr           STRTAB          08048268 000268 000183 00   A  0   0  1

    [ 6] .gnu.version      VERSYM          080483ec 0003ec 00001a 02   A  4   0  2

    [ 7] .gnu.version_r    VERNEED         08048408 000408 000060 00   A  5   2  4

    [ 8] .rel.dyn          REL             08048468 000468 000010 08   A  4   0  4

    [ 9] .rel.plt          REL             08048478 000478 000048 08   A  4  11  4

    [10] .init             PROGBITS        080484c0 0004c0 000017 00  AX  0   0  4

    [11] .plt              PROGBITS        080484d8 0004d8 0000a0 04  AX  0   0  4

    [12] .text             PROGBITS        08048580 000580 000268 00  AX  0   0 16

    [13] .fini             PROGBITS        080487e8 0007e8 00001c 00  AX  0   0  4

    [14] .rodata           PROGBITS        08048804 000804 00001a 00   A  0   0  4

    [15] .eh_frame_hdr     PROGBITS        08048820 000820 000044 00   A  0   0  4

    [16] .eh_frame         PROGBITS        08048864 000864 00010c 00   A  0   0  4

    [17] .ctors            PROGBITS        08049970 000970 00000c 00  WA  0   0  4

    [18] .dtors            PROGBITS        0804997c 00097c 000008 00  WA  0   0  4

    [19] .jcr              PROGBITS        08049984 000984 000004 00  WA  0   0  4

    [20] .dynamic          DYNAMIC         08049988 000988 0000e0 08  WA  5   0  4

    [21] .got              PROGBITS        08049a68 000a68 000004 04  WA  0   0  4

    [22] .got.plt          PROGBITS        08049a6c 000a6c 000030 04  WA  0   0  4

    [23] .data             PROGBITS        08049a9c 000a9c 000004 00  WA  0   0  4

    [24] .bss              NOBITS          08049aa0 000aa0 000098 00  WA  0   0  8

    [25] .comment          PROGBITS        00000000 000aa0 000114 00      0   0  1

    [26] .shstrtab         STRTAB          00000000 000bb4 0000e9 00      0   0  1

    [27] .symtab           SYMTAB          00000000 001128 000510 10     28  53  4

    [28] .strtab           STRTAB          00000000 001638 0003f4 00      0   0  1

    Key to Flags:

    W (write), A (alloc), X (execute), M (merge), S (strings)

    I (info), L (link order), G (group), x (unknown)

    O (extra OS processing required) o (OS specific), p (processor specific)

    *将文件转换成S-record格式:

    [root@lv-k cppDemo]#objcopy -O srec main main.srec

    这里,如果不指定main.srec那么会改变原来的文件,转换通常涉及到text段,也可以转换.o文件。当然,转换之后的文件不能直接运行了。在生成s-record过程中,有时需要用选项“-S”,“-R”去除掉binary文件,s-record文件不需要的相应信息。

    输出的文件内容类似如下:

    [root@lv-k cppDemo]# head main.rec

    S00B00006D61696E2E726563E7

    S315080481342F6C69622F6C642D6C696E75782E736F57

    S308080481442E3200C6

    S31508048148040000001000000001000000474E550016

    S3150804815800000000020000000600000009000000F4

    S3150804816803000000090000000100000005000000E3

    S31508048178012A102100000000090000000B00000075

    S31508048188AC4BE3C021FDF40914980C4379496BB642

    S3150804819800000000000000000000000000000000C5

    S315080481A83701000000000000540000001200000017

    ...省略...

    可见srec格式的文件是文本形式的。

    *将文件转换成rawbinary格式:

    [root@lv-k cppDemo]# objcopy -O binary main main.bin

    这里同样,转换之后的main.bin也是不可直接运行的。比较一下三种格式文件的大小:

    [root@lv-k cppDemo]# ls -l main main.rec main.bin

    -rwxr-xr-x 1 root root 6700 07-07 18:04 main

    -rwxr-xr-x 1 root root 6508 07-19 16:42 main.bin

    -rwxr-xr-x 1 root root 7366 07-19 16:34 main.rec

    将object文件转换成raw binary格式时,通常将去除掉symbols和relocation信息。

    *生成一个不含重定位以及标号目标文件:

    [root@lv-k cppDemo]# objcopy -S main main.stripall

    这里,生成的文件,仍然可以运行。查看大小对比如下:

    [root@lv-k cppDemo]# ls -l main.stripall main

    -rwxr-xr-x 1 root root 6700 07-07 18:04 main

    -rwxr-xr-x 1 root root 4296 07-19 17:02 main.stripall

    经过实践,如果对包含调试信息的可执行文件进行这样的操作,生成的文件大小一样。

    可以对比main的信息,查看文件的段信息:

    [root@lv-k cppDemo]#  readelf main.stripall -S

    There are 27 section headers, starting at offset 0xc90:

    Section Headers:

    [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al

    [ 0]                   NULL            00000000 000000 000000 00      0   0  0

    [ 1] .interp           PROGBITS        08048134 000134 000013 00   A  0   0  1

    [ 2] .note.ABI-tag     NOTE            08048148 000148 000020 00   A  0   0  4

    [ 3] .gnu.hash         GNU_HASH        08048168 000168 000030 04   A  4   0  4

    [ 4] .dynsym           DYNSYM          08048198 000198 0000d0 10   A  5   1  4

    [ 5] .dynstr           STRTAB          08048268 000268 000183 00   A  0   0  1

    [ 6] .gnu.version      VERSYM          080483ec 0003ec 00001a 02   A  4   0  2

    [ 7] .gnu.version_r    VERNEED         08048408 000408 000060 00   A  5   2  4

    [ 8] .rel.dyn          REL             08048468 000468 000010 08   A  4   0  4

    [ 9] .rel.plt          REL             08048478 000478 000048 08   A  4  11  4

    [10] .init             PROGBITS        080484c0 0004c0 000017 00  AX  0   0  4

    [11] .plt              PROGBITS        080484d8 0004d8 0000a0 04  AX  0   0  4

    [12] .text             PROGBITS        08048580 000580 000268 00  AX  0   0 16

    [13] .fini             PROGBITS        080487e8 0007e8 00001c 00  AX  0   0  4

    [14] .rodata           PROGBITS        08048804 000804 00001a 00   A  0   0  4

    [15] .eh_frame_hdr     PROGBITS        08048820 000820 000044 00   A  0   0  4

    [16] .eh_frame         PROGBITS        08048864 000864 00010c 00   A  0   0  4

    [17] .ctors            PROGBITS        08049970 000970 00000c 00  WA  0   0  4

    [18] .dtors            PROGBITS        0804997c 00097c 000008 00  WA  0   0  4

    [19] .jcr              PROGBITS        08049984 000984 000004 00  WA  0   0  4

    [20] .dynamic          DYNAMIC         08049988 000988 0000e0 08  WA  5   0  4

    [21] .got              PROGBITS        08049a68 000a68 000004 04  WA  0   0  4

    [22] .got.plt          PROGBITS        08049a6c 000a6c 000030 04  WA  0   0  4

    [23] .data             PROGBITS        08049a9c 000a9c 000004 00  WA  0   0  4

    [24] .bss              NOBITS          08049aa0 000aa0 000098 00  WA  0   0  8

    [25] .comment          PROGBITS        00000000 000aa0 000114 00      0   0  1

    [26] .shstrtab         STRTAB          00000000 000bb4 0000d9 00      0   0  1

    Key to Flags:

    W (write), A (alloc), X (execute), M (merge), S (strings)

    I (info), L (link order), G (group), x (unknown)

    O (extra OS processing required) o (OS specific), p (processor specific)

    由此可见去掉的两个信息分别是:

    [27] .symtab           SYMTAB          00000000 001128 000510 10     28  53  4

    [28] .strtab           STRTAB          00000000 001638 0003f4 00      0   0  1

    *去掉指定名称的节:

    [root@lv-k cppDemo]# objcopy -R .comment main main.remove

    这里,去掉之后,可执行文件也是可以运行的。通过"readelf -S main.remove"可知,其中的.comment节已经没有了。和此“相反”的操作是通过-j将指定的节拷贝到目标文件。

    *添加一个自定义的节到可执行文件并将一个文件内容添加到其中:

    [root@lv-k cppDemo]# objcopy --add-section mysection=hello_text main main.add

    这样,将会创建一个mysection的节并把hello_text的内容添加到其中。通过readelf -S main.add可以看到会多了一个"mysection"节。这个选项只在那些可以支持任意名称section的文件好用。添加到在我的centeros中编译的可执行文件中,可执行文件仍然可以运行。

    *将指定的段拷贝出来:

    [root@lv-k cppDemo]# objcopy -j mysection main.add section_hello

    输入之后,输出如下:

    [root@lv-k cppDemo]# objcopy -j mysection main.add section_hello

    BFD: main.add: warning: Empty loadable segment detected, is this intentional ?

    BFD: main.add: warning: Empty loadable segment detected, is this intentional ?

    这样会将main.add中刚才添加的mysection拷贝出来,拷贝出来的内容存放在section_hello文件中。这个命令将指定的section拷贝到输出文件,可以多次指定,并且注意如果使用不当会导致输出文件不可用。通过file命令查看,发现生成的文件仍然是elf文件,不只有该段的内容。使用"readelf -S section_hello"查看文件内容,如下:

    There are 5 section headers, starting at offset 0x144:

    Section Headers:

    [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al

    [ 0]                   NULL            00000000 000000 000000 00      0   0  0

    [ 1] mysection         PROGBITS        00000000 0000f4 000028 00      0   0  1

    [ 2] .shstrtab         STRTAB          00000000 00011c 000025 00      0   0  1

    [ 3] .symtab           SYMTAB          00000000 00020c 000020 10      4   2  4

    [ 4] .strtab           STRTAB          00000000 00022c 000001 00      0   0  1

    Key to Flags:

    W (write), A (alloc), X (execute), M (merge), S (strings)

    I (info), L (link order), G (group), x (unknown)

    O (extra OS processing required) o (OS specific), p (processor specific)

    readelf: Error: no .dynamic section in the dynamic segment

    **分离可执行文件以及调试信息并将两者关联

    这里,main.debug是包含调试信息的可执行文件(使用"gcc -g"编译生成),为了减小文件大小,并且同样可以进行调试,将可执行文件分成两个部分:将其中的调试信息提取出来之后保存成一个文件,再生成去掉调试信息的大小减少了的可执行文件,最后通过链接的形式将两个文件关联。

    过程如下:

    1)生成调试信息文件:

    [root@lv-k cppDemo]# objcopy --only-keep-debug main.debug main.debuginfo

    这样,会将调试信息提取,保存到文件main.debuginfo中。执行之后比较文件大小如下:

    [root@lv-k cppDemo]# ls -l main.debuginfo main main.debug

    -rwxr-xr-x 1 root root  6700 07-07 18:04 main

    -rwxr-xr-x 1 root root 38932 07-07 18:04 main.debug

    -rwxr-xr-x 1 root root 38628 07-21 09:47 main.debuginfo

    这里,main是没有使用-g命令生成的可执行文件只是为了比较。

    2)生成不含调试信息的可执行文件:

    [root@lv-k cppDemo]# objcopy --strip-debug main.debug main.stripdebug

    这样,就将原来可执行文件中的调试信息去掉,结果可执行的不含调试信息的可执行文件。生成之后,大小如下:

    [root@lv-k cppDemo]# ls -l main main.debug main.stripdebug

    -rwxr-xr-x 1 root root  6700 07-07 18:04 main

    -rwxr-xr-x 1 root root 38932 07-07 18:04 main.debug

    -rwxr-xr-x 1 root root  6632 07-21 09:49 main.stripdebug

    3)为不含调试信息的可执行文件添加调试信息:

    [root@lv-k cppDemo]# objcopy --add-gnu-debuglink=main.debuginfo main.stripdebug

    这样,就为main.stripdebug文件添加了调试信息,现在可以运行"gdb main.stripdebug"进行调试了。运行完毕之后,main.stripdebug文件中会多了一个"[26] .gnu_debuglink    PROGBITS        00000000 000bb4 000014 00      0   0  1"节。运行这个命令之后,文件大小信息对比如下:

    [root@lv-k cppDemo]# ls -l main main.debug main.debuginfo main.stripdebug

    -rwxr-xr-x 1 root root  6700 07-07 18:04 main

    -rwxr-xr-x 1 root root 38932 07-07 18:04 main.debug

    -rwxr-xr-x 1 root root 38628 07-21 09:47 main.debuginfo

    -rwxr-xr-x 1 root root  6720 07-21 09:51 main.stripdebug

    注意,实践发现:a)使用上面的命令之后,main.debuginfo以及源代码main.cpp两个文件必须在同一个目录上面才能使用gdb进行调试,否则会在调试的时候出现找不到文件的问题。当然,就是使用-g的选项编译之后,也得让源文件放在正确的路径下面才能够在调试的时候载入文件。b)对于原来没有使用-g生成的可执行文件,也可以使用这个方法为它添加调试信息让它(原来没有用-g生成的并且添加调试信息之后的可执行文件)可以调试。

    **

    [其它]

    1,关于可执行文件格式

    不同的嵌入式环境中,其组织可执行文件的格式也不相同,主要以下几种:ELF文件格式、S-record文件格式、HEX文件格式、bin文件格式。

    1)BIN文件格式

    原始的二进制格式,内部没地址标记,直接照二进制格式下载,并且照绝对地址烧写到Flash中就可以启动了,而如果下载运行,则下载到编译时的地址即可。

    2)ELF文件格式(Executable and linking format)

    Executable and linking format(ELF)文件是Linux系统 下的一种常用、可移植目标文件(object file)格式,它有三种主要类型:

    可重定位文件(Relocatable File):包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据。

    可执行文件(Executable File):包含适合于执行的一个程序,此文件规定了exec() 如何创建一个程序的进程映像。

    共享目标文件(Shared Object File):包含可在两种上下文中链接的代码和数据。首先链接编辑器可以将它和其它可重定位文件和共享目标文件一起处理,生成另外一个目标文件。其次,动态链接器(Dynamic Linker)可能将它与某个可执行文件以及其它共享目标一起组合,创建进程映像。

    3)S-Record文件格式

    S-Record文件遵循Motorola制定的格式规范,是一种标准的、可打印格式的文件。 S-Record文件是通过对链接器生成的目标程序或 数据进行编码生成的,适用于在计算机平台间传送,也可以在编辑后用于交叉平台间的传送。S-Record文件编码简单,可以通过IDE下载,但无法在线实时调试。S-Record文件是由多条记录组成的,每条记录都是由5个字段组成的ASCII字符串。

    4)HEX文件格式

    Intel HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。Intel HEX文件经常被用于将程序或数据传输 存储到ROM、EPROM。大多数编程器和模拟器使用Intel HEX文件。

    5)可执行文件格式的差别

    a)HEX文件是包括地址信息的,而BIN文件格式只包括了数据本身,在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。而烧写BIN文件的时候,用户是一定需要指定地址信息的。

    b)BIN文件格式 对二进制文件而言,其实没有”格式”。文件只是包括了纯粹的二进制数据。

    c)HEX文件格式 HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录类型包括:记录数据域,文件结束域,扩展线性地址的记录,扩展 段地址的记录。在上面的后2种记录,都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算 地址的时候,都是以这些“基”地址为基础的。

    d)AXF是Arm特有的文件格式,它除了包含bin文件外,还额外包括了许多其他调试信息。在下载到目标板的时候,烧入ROM还是bin文件,额外的调试信息会被去掉

    一般来说,可以由elf文件转化为其它两种文件,hex也可以直接转换为bin文件,但是bin要转 化为hex文件必须要给定一个基地址。而hex和bin不能转化为elf文件,因为elf的信息量要大。另外还有一种ads的调试文件axf,它可以用以 下命令fromelf -nodebug xx.axf -bin xx.bin转化为bin文件。

    2,将图像编译到可执行文件内(不知道有什么作用)

    Q: 如何将一个二进制文件,比如图片,词典一类的东西做为.o文件,直接链接到可执行文件内部呢?

    A:

    $ objcopy -I binary -O elf32-i386 -B i386 14_95_13.jpg image.o

    $ gcc image.o tt.o -o tt

    $ nm tt | grep 14_95

    0805d6c7 D _binary_14_95_13_jpg_end

    00014213 A _binary_14_95_13_jpg_size

    080494b4 D _binary_14_95_13_jpg_start

    参考:

    http://www.cnblogs.com/amethyst623/articles/1946499.html

    http://linux.chinaunix.net/techdoc/develop/2007/10/29/970892.shtml

    http://blog.csdn.net/gogofly_lee/article/details/2636257

    更多相关内容
  • 通过 -b 选项指定选择哪个字节如果不指定 -b 那么 objcopy 会忽略这个选项 --interleave-width=width 与 --interleave 配合使用,-b 指定起始下标,--interleave-width 则指定每次拷贝的字节数为 width,width ...

    点击上方 "编程技术圈"关注, 星标或置顶一起成长

    后台回复“大礼包”有惊喜礼包!

    日英文

    Once in your world, I lost himself; without your world now, I find better.

    曾经在你的世界里,我迷失了自己;现在在没有你的世界里,我找到了更好的自己。

    每日掏心话

    人生就是这样的匆匆,谁也不知道是谁对谁错,曾经的一场错过,成了彼此生命中永远解不开的纠葛。如若,没有那场的相遇,或许就没有今生如此多的劫难。

    责编:乐乐 | 来自:恋猫大鲤鱼

    链接:dablelv.blog.csdn.net/article/details/92708016

    编程技术圈(ID:study_tech)第 1178 次推文

    往日回顾:23 种设计模式的通俗解释,虽然有点污,但是秒懂

         

       正文   

    1.命令简介

    将目标文件的一部分或者全部内容拷贝到另外一个目标文件中,或者实现目标文件的格式转换,是 GNU Binutils 的一员。

    objcopy 工具使用 BFD 库读写目标文件,它可以将一个目标文件的内容拷贝到另外一个目标文件。objcopy 通过它的选项来控制其不同的动作,它可以将目标文件拷贝成和原来的文件不一样的格式。需要注意的是 objcopy 能够在两种格式之间拷贝一个完全链接的文件,在两种格式之间拷贝一个可重定位的目标文件可能不会正常地工作。

    objcopy 在做转换的时候会创建临时文件,然后将这些临时文件删除。objcopy 使用 BFD 来做它所有的转换工作;它访问 BFD 中描述的所有格式,可以不必指定就识别大多数的格式。
    通过指定输出目标为 srec(例如 -O srec),objcopy 可以用来生成 S-record 文件。

    通过指定输入目标为二进制文件(例如-O binary),objcopy 可以生成原始格式的二进制文件。当 objcopy 生成一个原始格式的二进制文件的时候,它会生成输入的目标文件的基本内存拷贝,然后所有的符号和可重定位信息都会被去掉。内存拷贝开始于最低段的加载地址,拷贝到输出文件。

    当生成一个 S-record 或者原始的二进制文件的时候,可以使用-S选项来移除一些调试信息。有时-R可以用来移除一些二进制文件不需要的段。

    搜索后端架构师公众号回复“架构整洁”,送你一份惊喜礼包。

    注意:objcopy 不能用来改变文件的大小端属性。

    2.命令格式

    objcopy [OPTION] [INFILE] [OUTFILE]
    

    3.选项说明

    -I bfdname, --input-target=bfdname
     指定输入文件的格式 bfdname,可取值 elf32-little,elf32-big 等,而不是让 objcopy 去推测
    -O bfdname, --output-target=bfdname
        指定输出文件的的格式 bfdname
    -F bfdname, --target=bfdname
        指定输入、输出文件的 bfdname,目标文件格式,只用于在目标和源文件之间传输数据,不转换
    -B bfdarch, --binary-architecture=bfdarch
     将无架构的输入文件转换为目标文件时很有用,输出体系结构可以设置为 bfdarch。如果输入文件具有已知的架构,将忽略此选项。可以在程序内通过引用转换过程创建的特殊符号来访问二进制数据。这些符号称为 _binary_objfile_start、_binary_objfile_end 和 _binary_objfile_size。例如,您可以将图片文件转换为对象文件,然后使用这些符号在代码中访问它
    -j pname, --only-p=pname 
        只将由 pname 指定的 p 拷贝到输出文件,可以多次指定,并且注意如果使用不当会导致输出文件不可用
    -R pname, --remove-p=pname 
     从输出文件中去除掉指定的 p,可以多次指定,并且注意如果使用不当会导致输出文件不可用
    -S, --strip-all 
        不从源文件拷贝符号信息和relocation信息。 
    -g, --strip-debug 
        不从源文件拷贝调试符号信息和相关的段。对使用 -g 编译生成的可执行文件执行该选项后,生成的结果文件几乎和不用 -g 编译生成的可执行文件一样
    --strip-unneeded 
     去掉所有重定位处理不需要的符号
    -K symbolname, --keep-symbol=symbolname
        strip 的时候,保留由 symbolname 指定的符号信息。该选项可以多次指定
    -N symbolname, --strip-symbol=symbolname 
        不拷贝由 symbolname 指定的符号信息。该选项可以多次指定 
    --strip-unneeded-symbol=symbolname
     不拷贝重定位不需要的符号。该选项可以多次指定
    -G symbolname, --keep-global-symbol=symbolname
     只保留 symbolname 为全局的,让其他符号均为局部符号,外部不可见。该选项可以多次指定
    --localize-hidden
     在 ELF 目标文件中,将所有具有隐藏或内部可见性的符号标记为“局部”。此选项适用于特定的符号本地化的选项,如 -L
    -L symbolname, --localize-symbol=symbolname 
     将变量 symbolname 变成文件局部的变量。该选项可以多次指定
    -W symbolname, --weaken-symbol=symbolname 
        将指定符号变为弱符号。该选项可以多次指定
    --globalize-symbol=symbolname 
        让变量symbolname变成全局范围,这样它可以在定义它的文件外部可见。可以多次指定。 
    -w, --wildcard
        允许对其他选项中的 symbolname 使用正则表达式。问号(?),星号(*),反斜线(\),和中括号([])可以出现在 symbolname 的任何位置。如果 symbolname 
     的第一个字符是感叹号(!),那么表示相反的含义,例如
        -w -W !foo -W fo*
        表示将要弱化所有以 "fo" 开头的符号,但是除了符号 "foo"
    -x, --discard-all
     不从源文件中拷贝非全局符号
    -X, --discard-locals
     不拷贝编译器生成的局部变量(一般以 L 或者 .. 开头)
    -b byte, --byte=byte
     只保留输入文件的每个第 byte 个字节(不会影响头部数据)。byte 的范围可以是 0 到 interleave-1。这里,interleave 通过 -i 选项指定,默认为 4。将文件创建成程序 rom 的时候,这个命令很有用。它经常用于 srec 输出目标
    -i interleave, --interleave=interleave 
     每隔 interleave 字节拷贝 1 byte,interleave 默认为 4。通过 -b 选项指定选择哪个字节如果不指定 -b 那么 objcopy 会忽略这个选项
    --interleave-width=width
     与 --interleave 配合使用,-b 指定起始下标,--interleave-width 则指定每次拷贝的字节数为 width,width 默认为 1。注意 -b 指定的下标与 --interleave-width 指定的字节数相加不能超过 -i 设定的宽度
    -p, --preserve-dates
     将输出文件的访问和修改日期设置为与输入文件的访问和修改日期相同
    -D, --enable-deterministic-archives
     以确定性模式操作。复制存档成员和写入存档索引时,对 uid、gid、时间戳使用零,对所有文件使用一致的文件模式。如果 binutils 配置了 --enable-deterministic-archives,那么这个模式是打开的,可以使用 -U 来禁止
    -U, --disable-deterministic-archives
     与 -D 作用相反。复制存档成员和写入存档索引时,复制存档成员和写入存档索引时,使用他们实际的 uid、gid、时间戳和文件模式。这个选项是默认的,除非 binutils 配置了 --enable-deterministic-archives
    --debugging
     如果可能,转换调试信息。这不是默认设置,因为只支持某些调试格式,而且转换过程可能很耗时
    --gap-fill val
        在 p 之间的空隙中填充 val
    --pad-to address
     将输出文件填充到加载地址 address。这是通过增加最后一段的大小来完成的。用 --gap-fill 指定的值(默认为零)填充额外的空间
    --set-start val 
        设定新文件的起始地址为 val,并不是所有格式的目标文件都支持设置起始地址
    --change-start INCR, --adjust-start INCR
        通过增加指定的值 INCR来调整起始地址,并不是所有格式的目标文件都支持设置起始地址
    --change-addresses INCR, --adjust-vma INCR
     通过增加 INCR 调整所有 ps 的 VMA(virtual memory address)和 LMA(load memory address)以及起始地址。有些目标文件格式不支持对段地址的任意改动。注意,这不会重新定位分区
    --change-p-address ppattern{=,+,-}val, --adjust-p-vma ppattern{=,+,-}val 
     调整指定 p 的 VMA/LMA 地址。如果 ppattern 未匹配到 p,则会引发告警,除非使用 --no-change-warnings 抑制告警
    --change-p-lma ppattern{=,+,-}val
     调整指定 p 的 LMA 地址
    --change-p-vma ppattern{=,+,-}val
     调整指定 p 的 VMA 地址
    --change-warnings, --adjust-warnings
     使用 --change-p-address、--adjust-p-lma、--adjust-p-vma,如果 p pattern 没有匹配到 p,引发告警。该选项为默认选项
    --no-change-warnings, --no-adjust-warnings
     使用 --change-p-address、--adjust-p-lma、--adjust-p-vma,如果 p pattern 没有匹配到 p,不引发告警
    --set-p-flags ppattern=flag 
        为指定的 p 设置 flag,flag 是一个逗号分隔的由 flag name 组成的字符串,取值可以为 alloc, contents, load, noload, readonly, code, data, rom, share, debug。我们可以为一个没有内容的 p 设置 contents flag,但是清除一个有内容的 p 的 contents flag 是没有意义的--应当把相应的 p 移除。并不是所有的 flags 对所有格式的目标文件都有意义
    --add-p pname=filename
        在拷贝文件的时候,添加一个名为 pname 的 p,该 p 的内容为 filename 的内容,大小为文件大小。这个选项只在那些可以支持任意名称 p 的文件格式上生效
    --rename-p oldname=newname[,flags]
     将一个 p 的名字从 oldname 更改为 newname,同时也可以更改其 flags。这个在执行 linker 脚本进行重命名的时候,并且输出文件还是一个目标文件且不会是可执行文件的时候很有优势。 
        这个项在输入文件格式是 binary 的时候很有用,因为这经常会创建一个名称为 .data 的 p,例如,你想创建一个名称为 .rodata 的包含二进制数据的 p,这时候,你可以使用如下命令: 
        objcopy -I binary -O <output_format> -B <architecture> --rename-p .data=.rodata,alloc,load,readonly,data,contents <input_binary_file> <output_object_file>
    --long-p-names {enable,disable,keep}
     在处理 COFF 和 PE-COFF 格式目标文件时,控制对长段名称的处理。默认行为是 keep,保留长段名称(如果有)。enable 和 disable 分别强制启用或禁用在输出目标文件中使用长段名称
    --change-leading-char
     有些格式的目标文件在符号前使用特殊的前导字符,最常用的是下划线。此选项告诉 objcopy 在目标文件格式之间转换时更改每个符号的前导字符。如果不同的目标文件使用相同的前导字符,则此选项无效。否则,它将根据需要添加字符、删除字符或更改字符
    --remove-leading-char
     移除目标文件全局符号前的前导字符
    --reverse-bytes=num
     反转段中的字节。注意,段的大小必须可以被指定的数值 num 均分。该选项一般用于产生 ROM 映像用于在有问题的目标系统上进行调试。假如一个段的内容只有 8 个字节,为 12345678。
     使用 --reverse-bytes=2 ,输出文件中的结果是 21436587
     使用 --reverse-bytes=4,输出文件中的结果是 43218765
     使用 --reverse-bytes=2,接着再对输出文件使用 --reverse-bytes=4,再第二个输出文件中的结果将是 34127856
    --srec-len=ival
     只对输出目标文件格式 SREC 有意义。指定生成 SREC 文件的最大长度为 ival
    --srec-forceS3
     只对输出目标文件格式是 SREC 有意义。避免产生 S1/S2 记录,只产生 S3 格式的记录
    --redefine-sym old=new
     变更符号名称。当链接两个目标文件产生符号名称冲突时,可以使用该选项来解决
    --redefine-syms=filename
     将 --redefine-sym 选项应用于指定的文件 filename。该选项可以多次出现
    --weaken
     将所有全局符号变更为弱符号。改选只对在支持弱符号的目标文件格式有效
    --keep-symbols=filename
     将 --keep-symbol 选项应用于指定的文件 filename。该选项可以多次出现
    --strip-symbols=filename
     将 --strip-symbol 选项应用于指定的文件 filename。该选项可以多次出现
    --strip-unneeded-symbols=filename
     将 --strip-unneeded-symbol 选项应用于指定的文件 filename。该选项可以多次出现
    --keep-global-symbols=filename
     将 --keep-global-symbol 选项应用于指定的文件 filename。该选项可以多次出现
    --localize-symbols=filename
     将 --localize-symbol 选项应用于指定的文件 filename。该选项可以多次出现
    --globalize-symbols=filename
     将 --globalize-symbol 选项应用于指定的文件 filename。该选项可以多次出现
    --weaken-symbols=filename
     将 --weaken-symbol 选项应用于指定的文件 filename。该选项可以多次出现
    --alt-machine-code=index
     果输出体系结构具有备用机器代码,请使用 indexth 代码而不是默认代码
    --add-gnu-debuglink=path-to-file 
        为输出文件创建一个.gnu_debuglink 段,该段包含对一个调试信息文件 path-to-file 的引用
    --writable-text
     将输出文本标记为可写。此选项对所有目标文件格式都没有意义
    --readonly-text
     将输出文本标记为只读。此选项对所有目标文件格式都没有意义
    --pure
     将输出文件标记为按需分页。此选项对所有目标文件格式都没有意义
    --impure
     将输出文件标记为不纯。此选项对所有对象文件格式都没有意义
    --prefix-symbols=string
     在输出文件中使用指定的字符串作为符号的前缀
    --prefix-ps=string
     在输出文件中使用指定的字符串作为所有段名的前缀
    --prefix-alloc-ps=string
     在输出文件中使用指定的字符串作为所有分配的段名的前缀
    --add-gnu-debuglink=path-to-file
     创建一个 .gnu-debuglink 段,该段包含一个特定路径的文件引用,并且把它添加到输出文件中
    --only-keep-debug 
        对文件进行 strip,移走所有不会被 --strip-debug 移走的 p,并且保持调试相关的 p 原封不动
    --strip-dwo
     删除所有 DWARF .dwo 段的内容,保留其余调试段和所有符号的完整性
    --extract-dwo
     提取所有 DWARF .dwo 段的内容
    --file-alignment num
     指定文件对齐方式。文件中的段始终相对于文件起始部分的偏移量是数值 num 的整数倍,默认值为512。此选项特定于 PE 文件
    --heap reserve, --heap reserve,commit
     指定要保留的内存字节数,以用作此程序的堆。此选项特定于 PE 文件
    --image-base value
     使用指定的值 value 作为程序或 dll 的基地址。这是加载程序或 dll 时使用的最低内存位置。为了减少重新定位进而提高 dll 性能,每个 dll 都应该有一个唯一的基地址,且不应与其他 dll 重叠。对于可执行文件,默认值为 0x400000,对于 dll,默认值为 0x10000000。此选项特定于 PE 文件
    --p-alignment num
     设置段的对齐方式。段在内存中的起始地址是指定数值 num 的整数倍。num 默认为 0x1000。此选项特定于 PE 文件
    --stack reserve, --stack reserve,commit
     指定要保留的内存字节数,以用作此程序的栈。此选项特定于 PE 文件
    --subsystem which, --subsystem which:major, --subsystem which:major.minor
     指定程序执行的子系统。which 的合法值为 "native"、"windows"、"console"、"posix"、"efi-app"、"efi-bsd"、"efi-rtd"、"sal-rtd" 和 "xbox"。您也可以选择性地设置子系统版本。此选项特定于 PE 文件
    --extract-symbol
     保留文件的段标志和符号,但删除段的数据
    --compress-debug-ps
     使用 zlib 压缩 DWARF 调试部分
    -V, --version
     显示版本
    -v,--verbose
     冗余输出
    --help
     显示帮助
    --info
     显示所有可用架构和目标文件格式
    @file
     从文件中读取命令行选项
    

    4.常用示例

    为了后面的示例,先看一下源码。

    //
    //@file: main.cpp
    //
    
    #include <iostream>
    using namespace std;
    
    void my_print() {
        cout<<"print"<<endl;
    }    
    
    int main(int argc, char *argv[]) {
        my_print();
        cout<<"hello"<<endl;
        return 0;
    }
    

    通过 g++ 分别生成带调试信息与不带调试信息的可执行文件 main.debug 和 main。

    g++ -g -o main.debug main.cpp
    g++ -o main main.cpp
    

    (1)分离可执行文件中的调试信息后并将两者关联。

    #1.生成调试信息文件,将其中的调试信息提取出来之后保存成一个文件
    objcopy --only-keep-debug main.debug main.debuginfo
    
    #2.将调试信息从可执行文件中剥离
    objcopy --strip-debug main.debug main.stripdebug
    
    #3.为不含调试信息的可执行文件添加调试信息
    objcopy --add-gnu-debuglink=main.debuginfo main.stripdebug
    

    (2)添加一个自定义的段到可执行文件,段的内容由一个文件指定。

    objcopy --add-p myp=text.txt main main.add
    

    使用命令 readelf \-S main.add 可以看到可执行文件 main.add 中多出来了一个段 myp。

    Section Headers:
      [Nr] Name              Type             Address           Offset
           Size              EntSize          Flags  Link  Info  Alig
      ...
      [27] myp         PROGBITS         0000000000000000  00001088
           0000000000000006  0000000000000000           0     0     1
      ...
    

    (3)将指定的段拷贝出来。这里拷贝出我们新增的段 mysetion。

    objcopy --only-p=myp main.add p_hello
    

    (4)去掉指定名称的段。去掉我们新增的段 myp。

    objcopy -R myp main.add main.remove
    

    使用命令 readelf \-S main.remove 可以看到可执行文件 main.remove 中的段 myp 已经不见了。


    参考文献

    [1] objcopy manual
    [2] GNU Binutils
    [3] Linux命令手册.objcopy
    [4] Linux命令学习手册-objcopy命令

    PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

    版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

    欢迎加入后端架构师交流群,在后台回复“学习”即可。

    猜你还想看

    阿里、腾讯、百度、华为、京东最新面试题汇集

    爆炸性事件!刚刚,拼多多超越阿里成为第一,黄峥就辞任董事长,要去当"科学家"!股价一度暴跌9%,承诺三年不减持

    又一款Nginx 管理可视化神器!通过界面完成配置监控,一条龙!

    Java并发编程——你真的了解 volatile 关键字吗?

    BAT等大厂Java面试经验总结

    别找了,想获取 Java大厂面试题学习资料

    扫下方二维码回复「手册」就好了

    
    
    嘿,你在看吗?
    
    展开全文
  • objcopy命令介绍

    万次阅读 2019-06-12 13:32:02
    如果没有明确地格式要求,则Objcopy将访问所有在BFD库中已经描述了的并且它可以识别的格式, 请参见《GNUpro Decelopment Tools》中“using ld”一章中“BFD库”部分和“BFD库中规范的目标文件格式”部分。...
    objcopy 把一种目标文件中的内容复制到另一种类型的目标文件中.

    (1) 将图像编译到可执行文件内
    Q: 如何将一个二进制文件,比如图片,词典一类的东西做为.o文件,直接链接到可执行文件内部呢?
    A:
    $ objcopy -I binary -O elf32-i386 -B i386 14_95_13.jpg image.o
    $ gcc image.o tt.o -o tt
    $ nm tt | grep 14_95
    0805d6c7 D _binary_14_95_13_jpg_end
    00014213 A _binary_14_95_13_jpg_size
    080494b4 D _binary_14_95_13_jpg_start

    (2)使用objcopy把不用的信息去掉:
    $ objcopy -R .comment -R .note halo halo.min

    (3)
    $ objcopy -R .note -R .comment -S -O binary xyb xyb.bin
    -R .note -R .comment 表示移掉 .note 与 .comment 段
    -S 表示移出所有的标志及重定位信息
    -O binary xyb xyb.bin 表示由xyb生成二进制文件xyb.bin
    objcopy 工具使用指南
    objcopy Utility
    objcopy [ -F bfdname | --target=bfdname ]
    [ -I bfdname | --input-target=bfdname ]
    [ -O bfdname | --output-target= bfdname ]
    [ -S | --strip-all ] [ -g | --strip-debug ]
    [ -K symbolname | --keep-symbol= symbolname ]
    [ -N symbolname | --strip-symbol= symbolname ]
    [ -L symbolname | --localize-symbol= symbolname ]
    [ -W symbolname | --weaken-symbol= symbolname ]
    [ -x | --discard-all ] [ -X | --discard-locals ]
    [ -b byte | --byte= byte ]
    [ -i interleave | --interleave= interleave ]
    [ -R sectionname | --remove-section= sectionname ]
    [ -p | --preserve-dates ] [ --debugging ]
    [ --gap-fill= val ] [ --pad-to= address ]
    [ --set-start= val ] [ --adjust-start= incr ]
    [ --change-address= incr ]
    [ --change-section-address= section{=,+,-} val ]
    [ --change-warnings ] [ --no-change-warnings ]
    [ --set-section-flags= section= flags ]
    [ --add-section= sectionname= filename ]
    [ --change-leading char ] [--remove-leading-char ]
    [ --weaken ]
    [ -v | --verbose ] [ -V | --version ] [ --help ]
    input-file [ outfile ]
     
    GNU实用工具程序objcopy的作用是拷贝一个目标文件的内容到另一个目标文件中。Objcopy使用GNU BFD库去读或写目标文件。Objcopy可以使用不同于源目标文件的格式来写目的目标文件(也即是说可以将一种格式的目标文件转换成另一种格式的目标文 件)。通过以上命令行选项可以控制Objcopy的具体操作。
    Objcopy在进行目标文件的转换时,将生成一个临时文件,转换完成后就将这个临 时文件删掉。Objcopy使用BFD做转换工作。如果没有明确地格式要求,则Objcopy将访问所有在BFD库中已经描述了的并且它可以识别的格式, 请参见《GNUpro Decelopment Tools》中“using ld”一章中“BFD库”部分和“BFD库中规范的目标文件格式”部分。
    通过使用srec作为输出目标(使用命令行选项-o srec),Objcopy可以产生S记录格式文件。
    通 过使用binary作为输出目标(使用命令行选项-o binary),Objcopy可以产生原始的二进制文件。使用Objcopy产生一个原始的二进制文件,实质上是进行了一回输入目标文件内容的内存转 储。所有的符号和重定位信息都将被丢弃。内存转储起始于输入目标文件中那些将要拷贝到输出目标文件去的部分的最小虚地址处。
    使用Objcopy生成S记录格式文件或者原始的二进制文件的过程中,-S选项和-R选项可能会比较有用。-S选项是用来删掉包含调试信息的部分,-R选项是用来删掉包含了二进制文件不需要的内容的那些部分。
    input-file
    outfile
    参数input-file和outfile分别表示输入目标文件(源目标文件)和输出目标 文件(目的目标文件)。如果在命令行中没有明确地指定outfile,那么Objcopy将创建一个临时文件来存放目标结果,然后使用input- file的名字来重命名这个临时文件(这时候,原来的input-file将被覆盖)。
    -I bfdname
    --input-target=bfdname
    明确告诉Objcopy,源文件的格式是什么,bfdname是BFD库中描述的标准格式名。这样做要比“让Objcopy自己去分析源文件的格式,然后去和BFD中描述的各种格式比较,通过而得知源文件的目标格式名”的方法要高效得多。
    -O bfdname
    --output-target= bfdname
    使用指定的格式来写输出文件(即目标文件),bfdname是BFD库中描述的标准格式名。
    -F bfdname
    --target= bfdname
    明确告诉Objcopy,源文件的格式是什么,同时也使用这个格式来写输出文件(即目标文件),也就是说将源目标文件中的内容拷贝到目的目标文件的过程中,只进行拷贝不做格式转换,源目标文件是什么格式,目的目标文件就是什么格式。
    -R sectionname
    --remove-section= sectionname
    从输出文件中删掉所有名为sectionname的段。这个选项可以多次使用。
    注意:不恰当地使用这个选项可能会导致输出文件不可用。
    -S
    --strip-all (strip 剥去、剥)
    不从源文件中拷贝重定位信息和符号信息到输出文件(目的文件)中去。
    -g
    --strip-debug
    不从源文件中拷贝调试符号到输出文件(目的文件)中去。
    --strip-undeeded
    剥去所有在重定位处理时所不需要的符号。
    -K symbolname
    --keep-symbol= symbolname
    仅从源文件中拷贝名为symbolname的符号。这个选项可以多次使用。
    -N symbolname
    --strip-symbol= symbolname
    不从源文件中拷贝名为symbolname的符号。这个选项可以多次使用。它可以和其他的strip选项联合起来使用(除了-K symbolname | --keep-symbol= symbolname外)。
    -L symbolname
    --localize-symbol= symbolname
    使名为symbolname的符号在文件内局部化,以便该符号在该文件外部是不可见的。这个选项可以多次使用。
    -W symbolname
    -weaken-symbol= symbolname
    弱化名为symbolname的符号。这个选项可以多次使用。
    -x
    --discard-all (discard 丢弃、抛弃)
    不从源文件中拷贝非全局符号。
    -X
    --discard-locals
    不从源文件中拷贝又编译器生成的局部符号(这些符号通常是L或 . 开头的)。
    -b byte
    --byte= byte
    Keep only every byte of the input file (header data is not affected). byte can be
    in the range from 0 to interleave-1, where interleave is given by the -i or
    --interleave option, or the default of 4. This option is useful for creating files to
    program ROM . It is typically used with an srec output target.
    -i interleave
    --interleave= interleave (interleave 隔行、交叉)
    Only copy one out of every interleave bytes. Select which byte to copy with the
    -b or --byte option. The default is 4. objcopy ignores this option if you do not
    specify either -b or --byte.
    -p
    --preserve-dates (preserve 保存、保持)
    设置输出文件的访问和修改日期和输入文件相同。
    [ --debugging ]
    如果可能的话,转换调试信息。因为只有特定的调试格式被支持,以及这个转换过程要耗费一定的时间,所以这个选项不是默认的。
    --gap-fill= val
    使用内容val填充段与段之间的空隙。通过增加段的大小,在地址较低的一段附加空间中填充内容val来完成这一选项的功能。
    --pad-to= address
    填充输出文件到虚拟地址address。通过增加输出文件中最后一个段的大小,在输出文件中最后一 段的末尾和address之间的这段附加空间中,用--gap-fill= val选项中指定的内容val来填充(默认内容是0,即没有使用--gap-fill= val选项的情况下)。
    --set-start= val
    设置新文件(应该是输出文件吧?)的起始地址为val。不是所有的目标文件格式都支持设置起始地址。
    --change-start = incr
    --adjust-start= incr
    通过增加值incr来改变起始地址。不是所有的目标文件格式都支持设置起始地址。
    --change-addresses incr
    --adjust-vma incr
    Change the VMA and LMA addresses of all sections, section., as well as the
    start address, by adding incr. Some object file formats do not permit section
    addresses to be changed arbitrarily.
    通过加上一个值incr,改变所有段的VMA(Virtual Memory Address运行时地址)和LMA(Load Memory Address装载地址),以及起始地址。某些目标文件格式不允许随便更改段的地址。
    --change-section-address section{=,+,-} val
    --adjust-section-vma section{=,+,-} val
    设 置或者改变名为section的段的VMA(Virtual Memory Address运行时地址)和LMA(Load Memory Address装载地址)。如果这个选项中使用的是“=”,那么名为section的段的VMA(Virtual Memory Address运行时地址)和LMA(Load Memory Address装载地址)将被设置成val;如果这个选项中使用的是“-”或者“+”,那么上述两个地址将被设置或者改变成这两个地址的当前值减去或加上 val后的值。如果在输入文件中名为section的段不存在,那么Objcopy将发出一个警告,除非--no-change-warnings选项被 使用。
    这里的段地址设置和改变都是输出文件中的段相对于输入文件中的段而言的。例如:
    (1)--change-section-address .text = 10000
    这里是指将输入文件(即源文件)中名为.text的段拷贝到输出文件中后,输出文件中的.text段的VMA(Virtual Memory Address运行时地址)和LMA(Load Memory Address装载地址)将都被设置成10000。
    (2)--change-section-address .text + 100
    这 里是指将输入文件(即源文件)中名为.text的段拷贝到输出文件中后,输出文件中的.text段的VMA(Virtual Memory Address运行时地址)和LMA(Load Memory Address装载地址)将都被设置成以前输入文件中.text段的地址(当前地址)加上100后的值。
    --change-section-lma section{=,+,-} val
    仅设置或者改变名为section的段的 LMA(Load Memory Address装载地址)。一个段的LMA是程序被加载时,该段将被加载到的一段内存空间的首地址。通常LMA和VMA(Virtual Memory Address运行时地址)是相同的,但是在某些系统中,特别是在那些程序放在ROM的系统中,LMA和VMA是不相同的。如果这个选项中使用的是 “=”,那么名为section的段的LMA(Load Memory Address装载地址)将被设置成val;如果这个选项中使用的是“-”或者“+”,那么LMA将被设置或者改变成这两个地址的当前值减去或加上val 后的值。如果在输入文件中名为section的段不存在,那么Objcopy将发出一个警告,除非--no-change-warnings选项被使用。
    --change-section-vma section{=,+,-} val
    仅设置或者改变名为section的段的 VMA(Load Memory Address装载地址)。一个段的VMA是程序运行时,该段的定位地址。通常VMA和LMA(Virtual Memory Address运行时地址)是相同的,但是在某些系统中,特别是在那些程序放在ROM的系统中,LMA和VMA是不相同的。如果这个选项中使用的是 “=”,那么名为section的段的LMA(Load Memory Address装载地址)将被设置成val;如果这个选项中使用的是“-”或者“+”,那么LMA将被设置或者改变成这两个地址的当前值减去或加上val 后的值。如果在输入文件中名为section的段不存在,那么Objcopy将发出一个警告,除非--no-change-warnings选项被使用。
    --change-warnings
    --adjust-warnings
    如果命令行中使用了--change- section-address section{=,+,-} val或者--adjust-section-vma section{=,+,-} val,又或者--change-section-lma section{=,+,-} val,又或者--change-section-vma section{=,+,-} val,并且输入文件中名为section的段不存在,则Objcopy发出警告。这是默认的选项。
    --no-chagne-warnings
    --no-adjust-warnings
    如果命令行中使用了--change- section-address section{=,+,-} val或者--adjust-section-vma section{=,+,-} val,又或者--change-section-lma section{=,+,-} val,又或者--change-section-vma section{=,+,-} val,即使输入文件中名为section的段不存在, Objcopy也不会发出警告。
    --set-section-flags section=flags
    为为section的段设置一个标识。这个flags变量的可以取逗号分隔的多个标识名字符串(这些标识名字符串是能够被Objcopy程序所识别的),合法的标识名有alloc,load,readonly,code,data和rom。
    You can set the contents flag for a section which does not havecontents, but it is not meaningful to clear the contents flag of a section which does have contents; just remove the section instead. Not all flags are meaningful for all object file formats.
    --add-section sectionname=filename
    进行目标文件拷贝的过程中,在输出文件中增加一个名为 sectionname的新段。这个新增加的段的内容从文件filename得到。这个新增加的段的大小就是这个文件filename的大小。只要输出文 件的格式允许该文件的段可以有任意的段名(段名不是标准的,固定的),这个选项才能使用。
    --change-leading-char
    Some object file formats use special characters at the start of symbols. The most
    common such character is underscore, which compilers often add before every
    symbol. This option tells objcopy to change the leading character of every
    symbol when it converts between object file formats. If the object file formats use
    the same leading character, this option has no effect. Otherwise, it will add a
    character, or remove a character, or change a character, as appropriate.
    --remove-leading-char
    If the first character of a global symbol is a special symbol leading character used
    by the object file format, remove the character. The most common symbol leading
    character is underscore. This option will remove a leading underscore from all
    global symbols. This can be useful if you want to link together objects of different
    file formats with different conventions for symbol names.
    --weaken
    Change all global symbols in the file to be weak. This can be useful when building
    an object that will be linked against other objects using the -R option to the linker.
    This option is only effective when using an object file format that supports weak
    symbols.
    -V
    --version
    Show the version number of objcopy.
    -v
    --verbose
    Verbose output: list all object files modified. In the case of archives, objcopy -V
    lists all members of the archive.
    --help
    Show a summary of the options to objcopy.


    例如:程序打印出自身代码

    // test.c
    #include <stdio.h>
    #include <stdlib.h>
    extern char * _binary_test_c_start;
    int main()
    {
    	printf("%s", (char *)&_binary_test_c_start);
    	return 0;
    }

    SRC = test.c
    TAR = t.exe
    PE = pe-i386
    ELF = elf32-i386
    ALL:test.c
    	objcopy -I binary -O $(ELF) -B i386 test.c test.bin
    	gcc -o t.exe test.c test.bin


    转载于:https://my.oschina.net/dake/blog/196707

    展开全文
  • 11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy") find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy" PATHS "/usr/local/...

    Solution

    run the command below:

    $ brew install binutils
    Updating Homebrew...
    ==> Auto-updated Homebrew!
    Updated 1 tap (homebrew/cask).
    ==> Updated Casks
    Updated 2 casks.
    
    ==> Downloading https://ghcr.io/v2/homebrew/core/binutils/manifests/2.36.1
    Already downloaded: /Users/bytedance/Library/Caches/Homebrew/downloads/57240ee8b7c52da22430ef9d17d0b1dceb5893570f518a135b8484cc1c1c6bca--binutils-2.36.1.bottle_manifest.json
    ==> Downloading https://ghcr.io/v2/homebrew/core/binutils/blobs/sha256:993ab1e0149a47224c4e7063be178ff5d551b2
    ==> Downloading from https://pkg-containers.githubusercontent.com/ghcr1/blobs/sha256:993ab1e0149a47224c4e7063
    ######################################################################## 100.0%
    ==> Pouring binutils--2.36.1.big_sur.bottle.tar.gz
    ==> Caveats
    binutils is keg-only, which means it was not symlinked into /usr/local,
    because Apple's CLT provides the same tools.
    
    If you need to have binutils first in your PATH, run:
      echo 'export PATH="/usr/local/opt/binutils/bin:$PATH"' >> ~/.zshrc
    
    For compilers to find binutils you may need to set:
      export LDFLAGS="-L/usr/local/opt/binutils/lib"
      export CPPFLAGS="-I/usr/local/opt/binutils/include"
    
    ==> Summary
    🍺  /usr/local/Cellar/binutils/2.36.1: 83 files, 159.4MB
    $ mdfind -name objcopy
    
    $mdfind -name objcopy
    /usr/local/Cellar/binutils/2.36.1/share/man/man1/objcopy.1
    /usr/local/Cellar/binutils/2.36.1/x86_64-apple-darwin20.2.0/bin/objcopy
    /usr/local/Cellar/binutils/2.36.1/bin/objcopy
    /Users/bytedance/soft/ClickHouse/contrib/llvm/llvm/utils/gn/secondary/llvm/tools/llvm-objcopy

    then find the file ~/ClickHouse/CMakeLists.txt

    origin: find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy"

    # Make sure the final executable has symbols exported
    set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic")
    
    find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-12" "llvm-objcopy-11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy")

    changed:

    # Make sure the final executable has symbols exported
    set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic")
    
    find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy" PATHS "/usr/local/Cellar/binutils/2.36.1/bin/")

    e.g:

    # Make sure the final executable has symbols exported
    set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic")
    
    # find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-12" "llvm-objcopy-11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy")
    
    find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy" PATHS "/usr/local/Cellar/binutils/2.36.1/bin/")

    then you can follow the command, and you can build successfully.

    $ cd clickhouse
    $ mkdir build
    $ cd build
    $ cmake .. -DCMAKE_CXX_COMPILER=`which clang++` -DCMAKE_C_COMPILER=`which clang` -DCMAKE_BUILD_TYPE=Debug -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON

    https://github.com/ClickHouse/ClickHouse/issues/13597

    install log:

    $cmake .. -DCMAKE_CXX_COMPILER=`which clang++` -DCMAKE_C_COMPILER=`which clang` -DCMAKE_BUILD_TYPE=Debug -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON
    
    -- The C compiler identification is AppleClang 12.0.5.12050022
    -- The CXX compiler identification is AppleClang 12.0.5.12050022
    -- Detecting C compiler ABI info
    -- Detecting C compiler ABI info - done
    -- Check for working C compiler: /usr/bin/clang - skipped
    -- Detecting C compile features
    -- Detecting C compile features - done
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Check for working CXX compiler: /usr/bin/clang++ - skipped
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    
    -- The ASM compiler identification is Clang
    -- Found assembler: /Library/Developer/CommandLineTools/usr/bin/clang
    CMake Warning at cmake/find/ccache.cmake:17 (message):
      CCache is not found.  We recommend setting it up if you build ClickHouse
      from source often.  Setting it up will significantly reduce compilation
      time for 2nd and consequent builds
    Call Stack (most recent call first):
      CMakeLists.txt:69 (include)
    
    
    -- CMAKE_BUILD_TYPE: Debug
    -- Using objcopy: /usr/local/Cellar/binutils/2.36.1/bin/objcopy.
    -- Performing Test HAVE_SSE41
    -- Performing Test HAVE_SSE41 - Success
    -- Performing Test HAVE_SSE42
    -- Performing Test HAVE_SSE42 - Success
    -- Performing Test HAVE_SSSE3
    -- Performing Test HAVE_SSSE3 - Success
    -- Performing Test HAVE_AVX
    
    -- Performing Test HAVE_AVX - Success
    -- Performing Test HAVE_AVX2
    -- Performing Test HAVE_AVX2 - Success
    -- Performing Test HAVE_PCLMULQDQ
    -- Performing Test HAVE_PCLMULQDQ - Success
    -- Performing Test HAVE_POPCNT
    -- Performing Test HAVE_POPCNT - Success
    CMake Warning at CMakeLists.txt:371 (message):
      Cannot find llvm-ar.  System ar will be used instead.  It does not work
      with ThinLTO.
    
    
    CMake Warning at CMakeLists.txt:380 (message):
      Cannot find llvm-ranlib.  System ranlib will be used instead.  It does not
      work with ThinLTO.
    
    
    -- Performing Test SUPPORTS_CXXFLAG_error
    -- Performing Test SUPPORTS_CXXFLAG_error - Success
    -- Performing Test SUPPORTS_CFLAG_error
    -- Performing Test SUPPORTS_CFLAG_error - Success
    -- Default libraries: -nodefaultlibs  -lc -lm -lpthread -ldl
    -- Looking for pthread.h
    -- Looking for pthread.h - found
    -- Performing Test CMAKE_HAVE_LIBC_PTHREAD
    -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
    -- Found Threads: TRUE  
    -- Using libcxx: cxx
    -- Using libcxxfs: 
    -- Using libcxxabi: cxxabi
    -- Unit tests are enabled
    -- Building for: Darwin-20.3.0 x86_64  ;
        USE_STATIC_LIBRARIES=ON
        MAKE_STATIC_LIBRARIES=ON
        SPLIT_SHARED=
        UNBUNDLED=OFF
        CCACHE=CCACHE_FOUND-NOTFOUND 
    -- Using double-conversion:  : double-conversion
    -- Using ssl=1: /Users/bytedance/soft/ClickHouse/contrib/boringssl/include : ssl;crypto
    -- Using ldap=1: /Users/bytedance/soft/ClickHouse/contrib/openldap-cmake/darwin_x86_64/include;/Users/bytedance/soft/ClickHouse/contrib/openldap/include : ldap_r;lber
    -- Build without ICU (support for collations and charset conversion functions will be disabled)
    -- Using xz (lzma): /Users/bytedance/soft/ClickHouse/contrib/xz/src/liblzma/api : liblzma
    -- Using zlib-ng: /Users/bytedance/soft/ClickHouse/contrib/zlib-ng;/Users/bytedance/soft/ClickHouse/build/contrib/zlib-ng : zlib
    -- Using zstd: /Users/bytedance/soft/ClickHouse/contrib/zstd/lib : zstd
    -- Using sparsehash: /Users/bytedance/soft/ClickHouse/contrib/sparsehash-c11
    -- Using re2: /Users/bytedance/soft/ClickHouse/contrib/re2 : re2;  : re2_st
    -- Using krb5=1: /Users/bytedance/soft/ClickHouse/contrib/krb5/src/include;/Users/bytedance/soft/ClickHouse/build/contrib/krb5-cmake/include : krb5
    -- Using libgsasl=1: /Users/bytedance/soft/ClickHouse/contrib/libgsasl/src;/Users/bytedance/soft/ClickHouse/contrib/libgsasl/linux_x86_64/include : libgsasl
    -- Using cyrus-sasl: krb5=1: /Users/bytedance/soft/ClickHouse/contrib/cyrus-sasl/include : sasl2
    -- Using librdkafka=1: /Users/bytedance/soft/ClickHouse/contrib/librdkafka/src : rdkafka cppkafka
    -- Using libuv: /Users/bytedance/soft/ClickHouse/contrib/libuv : uv_a
    -- Using AMQP-CPP=1: /Users/bytedance/soft/ClickHouse/contrib/AMQP-CPP/include;/Users/bytedance/soft/ClickHouse/contrib/libuv/include;/Users/bytedance/soft/ClickHouse/contrib/AMQP-CPP : amqp-cpp;uv_a
    -- Using capnp=1: capnpc
    -- Using h3=1: /Users/bytedance/soft/ClickHouse/contrib/h3/src/h3lib/include : h3
    -- Using libxml2: /Users/bytedance/soft/ClickHouse/contrib/libxml2/include;/Users/bytedance/soft/ClickHouse/contrib/libxml2-cmake/linux_x86_64/include : libxml2
    -- Using brotli=1: /Users/bytedance/soft/ClickHouse/contrib/brotli/c/include : brotli
    -- Using protobuf=1: /Users/bytedance/soft/ClickHouse/contrib/protobuf/src : libprotobuf : $<TARGET_FILE:protoc> : libprotoc
    -- Using gRPC=1: /Users/bytedance/soft/ClickHouse/contrib/grpc/include : grpc;grpc++ : $<TARGET_FILE:grpc_cpp_plugin>
    -- Using pdqsort: /Users/bytedance/soft/ClickHouse/contrib/pdqsort
    -- Using miniselect: /Users/bytedance/soft/ClickHouse/contrib/miniselect/include
    -- Using curl: /Users/bytedance/soft/ClickHouse/contrib/curl/include : curl
    -- Using aws_s3=1: /Users/bytedance/soft/ClickHouse/contrib/aws/aws-cpp-sdk-s3/include : aws_s3
    -- Using snappy: snappy
    -- Using Parquet: arrow=arrow_static: ; parquet=parquet_static: ; thrift=thrift_static ; flatbuffers=flatbuffers
    -- Using simdjson=ON
    -- Using rapidjson=1: /Users/bytedance/soft/ClickHouse/contrib/rapidjson/include
    -- ODBC is only supported on Linux
    -- Not using unixodbc
    -- Using ROCKSDB=1: /Users/bytedance/soft/ClickHouse/contrib/rocksdb/include : rocksdb
    -- Using libpqxx=1: /Users/bytedance/soft/ClickHouse/contrib/libpqxx/include : libpqxx
    -- Using libpq: /Users/bytedance/soft/ClickHouse/contrib/libpq :  : libpq
    -- Using NuRaft=1: /Users/bytedance/soft/ClickHouse/contrib/NuRaft/include : nuraft
    -- Using snappy: snappy
    -- Using internal=1 orc=1: /Users/bytedance/soft/ClickHouse/contrib/orc/c++/include : orc
    -- Using snappy: snappy
    -- Using avro=1: /Users/bytedance/soft/ClickHouse/contrib/avro/lang/c++/include : avrocpp
    -- Using msgpack=1: /Users/bytedance/soft/ClickHouse/contrib/msgpack-c/include
    -- Using cassandra=1: /Users/bytedance/soft/ClickHouse/contrib/cassandra/include/ : cassandra_static
    -- Using stats=1 : /Users/bytedance/soft/ClickHouse/contrib/stats/include
    -- Using gcem=1: /Users/bytedance/soft/ClickHouse/contrib/gcem/include
    -- Using datasketches=1: /Users/bytedance/soft/ClickHouse/contrib/datasketches-cpp/common/include;/Users/bytedance/soft/ClickHouse/contrib/datasketches-cpp/theta/include : theta
    -- Using cityhash:  : cityhash
    -- Using farmhash:  : farmhash
    -- Using gtest=1: /Users/bytedance/soft/ClickHouse/contrib/googletest/googletest : gtest_main;gtest : 
    -- Build without mysqlclient (support for MYSQL dictionary source will be disabled)
    -- compiler C   = /usr/bin/clang  -fdiagnostics-color=always  -gdwarf-aranges -pipe -msse4.1 -msse4.2 -mpopcnt -fasynchronous-unwind-tables -falign-functions=32  -Wall -Wno-unused-command-line-argument  -fdiagnostics-absolute-paths -fexperimental-new-pass-manager -Werror -g -O0 -g3 -ggdb3 -fno-inline 
    -- compiler CXX = /usr/bin/clang++  -fdiagnostics-color=always -fsized-deallocation  -gdwarf-aranges -pipe -msse4.1 -msse4.2 -mpopcnt -fasynchronous-unwind-tables -falign-functions=32   -Wall -Wno-unused-command-line-argument  -stdlib=libc++ -fdiagnostics-absolute-paths -fexperimental-new-pass-manager -Werror -g -O0 -g3 -ggdb3 -fno-inline  -D_LIBCPP_DEBUG=0
    -- LINKER_FLAGS = -L/usr/local/opt/thrift@0.9/lib -rdynamic -Wl,-U,_inside_main 
    -- Packaging with tzdata version: 2020e
    
    -- Using cctz
    -- Using hyperscan
    CMake Warning at contrib/jemalloc-cmake/CMakeLists.txt:23 (message):
      jemalloc support on non-linux is EXPERIMENTAL
    
    
    -- jemalloc malloc_conf: oversize_threshold:0,muzzy_decay_ms:5000,dirty_decay_ms:5000
    -- Using jemalloc
    -- Using cpuid
    -- Using replxx
    -- Performing Test HAVE___BUILTIN_BSWAPXX
    -- Performing Test HAVE___BUILTIN_BSWAPXX - Success
    -- Performing Test HAVE___BUILTIN_ASSUME_ALIGNED
    -- Performing Test HAVE___BUILTIN_ASSUME_ALIGNED - Success
    -- Looking for clock_gettime
    -- Looking for clock_gettime - found
    -- Looking for CLOCK_MONOTONIC
    -- Looking for CLOCK_MONOTONIC - found
    -- Looking for pthread_condattr_setclock
    -- Looking for pthread_condattr_setclock - not found
    -- Checking how to detect the number of available CPU cores
    -- Performing Test TUKLIB_CPUCORES_SCHED_GETAFFINITY
    -- Performing Test TUKLIB_CPUCORES_SCHED_GETAFFINITY - Failed
    -- Performing Test TUKLIB_CPUCORES_CPUSET
    -- Performing Test TUKLIB_CPUCORES_CPUSET - Failed
    -- Looking for sys/param.h
    -- Looking for sys/param.h - found
    -- Performing Test TUKLIB_CPUCORES_SYSCTL
    
    -- Performing Test TUKLIB_CPUCORES_SYSCTL - Success
    -- Checking how to detect the amount of physical memory
    -- Performing Test TUKLIB_PHYSMEM_SPECIAL
    -- Performing Test TUKLIB_PHYSMEM_SPECIAL - Failed
    -- Performing Test TUKLIB_PHYSMEM_AIX
    -- Performing Test TUKLIB_PHYSMEM_AIX - Failed
    -- Performing Test TUKLIB_PHYSMEM_SYSCONF
    -- Performing Test TUKLIB_PHYSMEM_SYSCONF - Success
    -- Looking for immintrin.h
    -- Looking for immintrin.h - found
    -- Performing Test HAVE__MM_MOVEMASK_EPI8
    
    -- Performing Test HAVE__MM_MOVEMASK_EPI8 - Success
    -- Looking for getopt_long
    -- Looking for getopt_long - found
    -- Looking for program_invocation_name
    -- Looking for program_invocation_name - not found
    -- Looking for mbrtowc
    -- Looking for mbrtowc - found
    -- Looking for wcwidth
    -- Looking for wcwidth - found
    -- Looking for optreset
    -- Looking for optreset - found
    -- Looking for posix_fadvise
    -- Looking for posix_fadvise - not found
    -- Performing Test HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC
    -- Performing Test HAVE_STRUCT_STAT_ST_ATIM_TV_NSEC - Failed
    -- Performing Test HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC
    -- Performing Test HAVE_STRUCT_STAT_ST_ATIMESPEC_TV_NSEC - Success
    -- Looking for futimens
    -- Looking for futimens - found
    -- Using Poco::Crypto
    -- Not using Poco::Data::ODBC
    -- ZSTD VERSION 1.5.0
    -- Using CMake version 3.20.4
    -- ZLIB_HEADER_VERSION: 1.2.11
    -- ZLIBNG_HEADER_VERSION: 2.0.2
    -- Arch detected: 'x86_64'
    -- Basearch of 'x86_64' has been detected as: 'x86'
    -- Architecture supports unaligned reads
    -- Architecture supports unaligned reads of > 4 bytes
    ...
    ...
    
    -- Performing Test HAS_SHADOW - Success
    -- Performing Test HAS_SUGGEST_OVERRIDE
    -- Performing Test HAS_SUGGEST_OVERRIDE - Success
    -- /Users/bytedance/soft/ClickHouse/src: Have 11060 megabytes of memory.
            Limiting concurrent linkers jobs to 3 and compiler jobs to 4
    -- Will build ClickHouse 21.7.1.1 revision 54452 
    -- Generating debugger info for ClickHouse functions
    -- ClickHouse modes:
    -- Server mode: ON
    -- Client mode: ON
    -- Local mode: ON
    -- Benchmark mode: ON
    -- Extract from config mode: ON
    -- Compressor mode: ON
    -- Copier mode: ON
    -- Format mode: ON
    -- Obfuscator mode: ON
    -- ODBC bridge mode: OFF
    -- Library bridge mode: ON
    -- ClickHouse install: ON
    -- ClickHouse git-import: ON
    -- ClickHouse keeper mode: ON
    -- bash_completion will be written to /usr/local/share/bash-completion/completions
    -- Target check already exists
    -- /Users/bytedance/soft/ClickHouse/utils: Have 11051 megabytes of memory.
            Limiting concurrent linkers jobs to 3 and compiler jobs to OFF
    -- Configuring done
    
    CMake Warning (dev):
      Policy CMP0068 is not set: RPATH settings on macOS do not affect
      install_name.  Run "cmake --help-policy CMP0068" for policy details.  Use
      the cmake_policy command to set the policy and suppress this warning.
    
      For compatibility with older versions of CMake, the install_name fields for
      the following targets are still affected by RPATH settings:
    
       cassandra
       uv
    
    This warning is for project developers.  Use -Wno-dev to suppress it.
    
    -- Generating done
    
    -- Build files have been written to: /Users/bytedance/soft/ClickHouse/build
    $ninja

    注意事项

    若你想运行 clickhouse-server,请先确保增加系统的最大文件数配置。

    注意

    可能需要用 sudo

    为此,请创建以下文件:

    /资源库/LaunchDaemons/limit.maxfiles.plist:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
    
     "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    
    <plist version="1.0">
    
     <dict>
    
     <key>Label</key>
    
     <string>limit.maxfiles</string>
    
     <key>ProgramArguments</key>
    
     <array>
    
     <string>launchctl</string>
    
     <string>limit</string>
    
     <string>maxfiles</string>
    
     <string>524288</string>
    
     <string>524288</string>
    
     </array>
    
     <key>RunAtLoad</key>
    
     <true/>
    
     <key>ServiceIPC</key>
    
     <false/>
    
     </dict>
    
    </plist>

    执行以下命令:

    $ sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

    然后重启。

    可以通过

    ulimit -n

    命令来检查是否生效。

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.3)
    
    foreach(policy
            CMP0023
            CMP0048 # CMake 3.0
            CMP0074 # CMake 3.12
            CMP0077
            CMP0079
        )
        if(POLICY ${policy})
            cmake_policy(SET ${policy} NEW)
        endif()
    endforeach()
    
    # set default policy
    foreach(default_policy_var_name
            # make option() honor normal variables for BUILD_SHARED_LIBS:
            # - re2
            # - snappy
            CMAKE_POLICY_DEFAULT_CMP0077
            # Google Test from sources uses too old cmake, 2.6.x, and CMP0022 should
            # set, to avoid using deprecated LINK_INTERFACE_LIBRARIES(_<CONFIG>)? over
            # INTERFACE_LINK_LIBRARIES.
            CMAKE_POLICY_DEFAULT_CMP0022
        )
        set(${default_policy_var_name} NEW)
    endforeach()
    
    project(ClickHouse)
    
    # If turned off: e.g. when ENABLE_FOO is ON, but FOO tool was not found, the CMake will continue.
    option(FAIL_ON_UNSUPPORTED_OPTIONS_COMBINATION
       "Stop/Fail CMake configuration if some ENABLE_XXX option is defined (either ON or OFF)
       but is not possible to satisfy" ON)
    
    if(FAIL_ON_UNSUPPORTED_OPTIONS_COMBINATION)
        set(RECONFIGURE_MESSAGE_LEVEL FATAL_ERROR)
    else()
        set(RECONFIGURE_MESSAGE_LEVEL WARNING)
    endif()
    
    enable_language(C CXX ASM)
    
    include (cmake/arch.cmake)
    include (cmake/target.cmake)
    include (cmake/tools.cmake)
    include (cmake/analysis.cmake)
    
    # Ignore export() since we don't use it,
    # but it gets broken with a global targets via link_libraries()
    macro (export)
    endmacro ()
    
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules/")
    set(CMAKE_EXPORT_COMPILE_COMMANDS 1) # Write compile_commands.json
    set(CMAKE_LINK_DEPENDS_NO_SHARED 1) # Do not relink all depended targets on .so
    set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Debug;Release;MinSizeRel" CACHE STRING "" FORCE)
    set(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "Generate debug library name with a postfix.")    # To be consistent with CMakeLists from contrib libs.
    
    # Enable the ability to organize targets into hierarchies of "folders" for capable GUI-based IDEs.
    # For more info see https://cmake.org/cmake/help/latest/prop_gbl/USE_FOLDERS.html
    set_property(GLOBAL PROPERTY USE_FOLDERS ON)
    
    # Check that submodules are present only if source was downloaded with git
    if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/.git" AND NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/boost/boost")
        message (FATAL_ERROR "Submodules are not initialized. Run\n\tgit submodule update --init --recursive")
    endif ()
    
    include (cmake/find/ccache.cmake)
    
    # Take care to add prlimit in command line before ccache, or else ccache thinks that
    # prlimit is compiler, and clang++ is its input file, and refuses to work  with
    # multiple inputs, e.g in ccache log:
    # [2021-03-31T18:06:32.655327 36900] Command line: /usr/bin/ccache prlimit --as=10000000000 --data=5000000000 --cpu=600 /usr/bin/clang++-11 - ...... std=gnu++2a -MD -MT src/CMakeFiles/dbms.dir/Storages/MergeTree/IMergeTreeDataPart.cpp.o -MF src/CMakeFiles/dbms.dir/Storages/MergeTree/IMergeTreeDataPart.cpp.o.d -o src/CMakeFiles/dbms.dir/Storages/MergeTree/IMergeTreeDataPart.cpp.o -c ../src/Storages/MergeTree/IMergeTreeDataPart.cpp
    #
    # [2021-03-31T18:06:32.656704 36900] Multiple input files: /usr/bin/clang++-11 and ../src/Storages/MergeTree/IMergeTreeDataPart.cpp
    #
    # Another way would be to use --ccache-skip option before clang++-11 to make
    # ccache ignore it.
    option(ENABLE_CHECK_HEAVY_BUILDS "Don't allow C++ translation units to compile too long or to take too much memory while compiling." OFF)
    if (ENABLE_CHECK_HEAVY_BUILDS)
        # set DATA (since RSS does not work since 2.6.x+) to 2G
        set (RLIMIT_DATA 5000000000)
        # set VIRT (RLIMIT_AS) to 10G (DATA*10)
        set (RLIMIT_AS 10000000000)
        # set CPU time limit to 600 seconds
        set (RLIMIT_CPU 600)
    
        # gcc10/gcc10/clang -fsanitize=memory is too heavy
        if (SANITIZE STREQUAL "memory" OR COMPILER_GCC)
           set (RLIMIT_DATA 10000000000)
        endif()
    
        set (CMAKE_CXX_COMPILER_LAUNCHER prlimit --as=${RLIMIT_AS} --data=${RLIMIT_DATA} --cpu=${RLIMIT_CPU} ${CMAKE_CXX_COMPILER_LAUNCHER})
    endif ()
    
    if (NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "None")
        set (CMAKE_BUILD_TYPE "RelWithDebInfo")
        message (STATUS "CMAKE_BUILD_TYPE is not set, set to default = ${CMAKE_BUILD_TYPE}")
    endif ()
    message (STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
    
    string (TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
    
    option(USE_STATIC_LIBRARIES "Disable to use shared libraries" ON)
    option(MAKE_STATIC_LIBRARIES "Disable to make shared libraries" ${USE_STATIC_LIBRARIES})
    
    if (NOT MAKE_STATIC_LIBRARIES)
        # DEVELOPER ONLY.
        # Faster linking if turned on.
        option(SPLIT_SHARED_LIBRARIES "Keep all internal libraries as separate .so files")
    
        option(CLICKHOUSE_SPLIT_BINARY
            "Make several binaries (clickhouse-server, clickhouse-client etc.) instead of one bundled")
    endif ()
    
    if (MAKE_STATIC_LIBRARIES AND SPLIT_SHARED_LIBRARIES)
        message(FATAL_ERROR "Defining SPLIT_SHARED_LIBRARIES=1 without MAKE_STATIC_LIBRARIES=0 has no effect.")
    endif()
    
    if (NOT MAKE_STATIC_LIBRARIES AND SPLIT_SHARED_LIBRARIES)
        set(BUILD_SHARED_LIBS 1 CACHE INTERNAL "")
    endif ()
    
    if (USE_STATIC_LIBRARIES)
        list(REVERSE CMAKE_FIND_LIBRARY_SUFFIXES)
    endif ()
    
    # Implies ${WITH_COVERAGE}
    option (ENABLE_FUZZING "Fuzzy testing using libfuzzer" OFF)
    
    if (ENABLE_FUZZING)
        message (STATUS "Fuzzing instrumentation enabled")
        set (WITH_COVERAGE ON)
        set (FUZZER "libfuzzer")
    endif()
    
    # Global libraries
    # See:
    # - default_libs.cmake
    # - sanitize.cmake
    add_library(global-libs INTERFACE)
    
    include (cmake/fuzzer.cmake)
    include (cmake/sanitize.cmake)
    
    if (CMAKE_GENERATOR STREQUAL "Ninja" AND NOT DISABLE_COLORED_BUILD)
        # Turn on colored output. https://github.com/ninja-build/ninja/wiki/FAQ
        set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always")
        set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color=always")
    endif ()
    
    include (cmake/add_warning.cmake)
    
    if (NOT MSVC)
        set (COMMON_WARNING_FLAGS "${COMMON_WARNING_FLAGS} -Wall")    # -Werror and many more is also added inside cmake/warnings.cmake
    endif ()
    
    if (COMPILER_CLANG)
        # clang: warning: argument unused during compilation: '-specs=/usr/share/dpkg/no-pie-compile.specs' [-Wunused-command-line-argument]
        set (COMMON_WARNING_FLAGS "${COMMON_WARNING_FLAGS} -Wno-unused-command-line-argument")
        # generate ranges for fast "addr2line" search
        if (NOT CMAKE_BUILD_TYPE_UC STREQUAL "RELEASE")
            set(COMPILER_FLAGS "${COMPILER_FLAGS} -gdwarf-aranges")
        endif ()
    endif ()
    
    # If turned `ON`, assumes the user has either the system GTest library or the bundled one.
    option(ENABLE_TESTS "Provide unit_test_dbms target with Google.Test unit tests" ON)
    option(ENABLE_EXAMPLES "Build all example programs in 'examples' subdirectories" OFF)
    
    if (OS_LINUX AND (ARCH_AMD64 OR ARCH_AARCH64) AND NOT UNBUNDLED AND MAKE_STATIC_LIBRARIES AND NOT SPLIT_SHARED_LIBRARIES AND CMAKE_VERSION VERSION_GREATER "3.9.0")
        # Only for Linux, x86_64 or aarch64.
        option(GLIBC_COMPATIBILITY "Enable compatibility with older glibc libraries." ON)
    elseif(GLIBC_COMPATIBILITY)
        message (${RECONFIGURE_MESSAGE_LEVEL} "Glibc compatibility cannot be enabled in current configuration")
    endif ()
    
    if (NOT CMAKE_VERSION VERSION_GREATER "3.9.0")
        message (WARNING "CMake version must be greater than 3.9.0 for production builds.")
    endif ()
    
    # Make sure the final executable has symbols exported
    set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -rdynamic")
    
    # find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-12" "llvm-objcopy-11" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy")
    
    find_program (OBJCOPY_PATH NAMES "llvm-objcopy" "llvm-objcopy-10" "llvm-objcopy-9" "llvm-objcopy-8" "objcopy" PATHS "/usr/local/Cellar/binutils/2.36.1/bin/")
    
    if (OBJCOPY_PATH)
       message(STATUS "Using objcopy: ${OBJCOPY_PATH}.")
    else ()
      message(FATAL_ERROR "Cannot find objcopy.")
    endif ()
    
    if (OS_DARWIN)
        # The `-all_load` flag forces loading of all symbols from all libraries,
        # and leads to multiply-defined symbols. This flag allows force loading
        # from a _specific_ library, which is what we need.
        set(WHOLE_ARCHIVE -force_load)
        # The `-noall_load` flag is the default and now obsolete.
        set(NO_WHOLE_ARCHIVE "")
    else ()
        set(WHOLE_ARCHIVE --whole-archive)
        set(NO_WHOLE_ARCHIVE --no-whole-archive)
    endif ()
    
    # Ignored if `lld` is used
    option(ADD_GDB_INDEX_FOR_GOLD "Add .gdb-index to resulting binaries for gold linker.")
    
    if (NOT CMAKE_BUILD_TYPE_UC STREQUAL "RELEASE")
        # Can be lld or ld-lld.
        if (LINKER_NAME MATCHES "lld$")
            set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--gdb-index")
            set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gdb-index")
            message (STATUS "Adding .gdb-index via --gdb-index linker option.")
        # we use another tool for gdb-index, because gold linker removes section .debug_aranges, which used inside clickhouse stacktraces
        # http://sourceware-org.1504.n7.nabble.com/gold-No-debug-aranges-section-when-linking-with-gdb-index-td540965.html#a556932
        elseif (LINKER_NAME MATCHES "gold$" AND ADD_GDB_INDEX_FOR_GOLD)
            find_program (GDB_ADD_INDEX_EXE NAMES "gdb-add-index" DOC "Path to gdb-add-index executable")
            if (NOT GDB_ADD_INDEX_EXE)
                set (USE_GDB_ADD_INDEX 0)
                message (WARNING "Cannot add gdb index to binaries, because gold linker is used, but gdb-add-index executable not found.")
            else()
                set (USE_GDB_ADD_INDEX 1)
                message (STATUS "gdb-add-index found: ${GDB_ADD_INDEX_EXE}")
            endif()
        endif ()
    endif()
    
    # Create BuildID when using lld. For other linkers it is created by default.
    if (LINKER_NAME MATCHES "lld$")
        # SHA1 is not cryptographically secure but it is the best what lld is offering.
        set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id=sha1")
    endif ()
    
    # Add a section with the hash of the compiled machine code for integrity checks.
    # Only for official builds, because adding a section can be time consuming (rewrite of several GB).
    # And cross compiled binaries are not supported (since you cannot execute clickhouse hash-binary)
    if (OBJCOPY_PATH AND YANDEX_OFFICIAL_BUILD AND (NOT CMAKE_TOOLCHAIN_FILE))
        set (USE_BINARY_HASH 1)
    endif ()
    
    cmake_host_system_information(RESULT AVAILABLE_PHYSICAL_MEMORY QUERY AVAILABLE_PHYSICAL_MEMORY) # Not available under freebsd
    
    
    if(NOT AVAILABLE_PHYSICAL_MEMORY OR AVAILABLE_PHYSICAL_MEMORY GREATER 8000)
        # Less `/tmp` usage, more RAM usage.
        option(COMPILER_PIPE "-pipe compiler option" ON)
    endif()
    
    if(COMPILER_PIPE)
        set(COMPILER_FLAGS "${COMPILER_FLAGS} -pipe")
    else()
        message(STATUS "Disabling compiler -pipe option (have only ${AVAILABLE_PHYSICAL_MEMORY} mb of memory)")
    endif()
    
    include(cmake/cpu_features.cmake)
    
    option(ARCH_NATIVE "Add -march=native compiler flag. This makes your binaries non-portable but more performant code may be generated.")
    
    if (ARCH_NATIVE)
        set (COMPILER_FLAGS "${COMPILER_FLAGS} -march=native")
    endif ()
    
    # Asynchronous unwind tables are needed for Query Profiler.
    # They are already by default on some platforms but possibly not on all platforms.
    # Enable it explicitly.
    set (COMPILER_FLAGS "${COMPILER_FLAGS} -fasynchronous-unwind-tables")
    
    if (${CMAKE_VERSION} VERSION_LESS "3.12.4")
        # CMake < 3.12 doesn't support setting 20 as a C++ standard version.
        # We will add C++ standard controlling flag in CMAKE_CXX_FLAGS manually for now.
    
        if (COMPILER_GCC OR COMPILER_CLANG)
            # to make numeric_limits<__int128> works with GCC
            set (_CXX_STANDARD "gnu++2a")
        else ()
            set (_CXX_STANDARD "c++2a")
        endif ()
    
        set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=${_CXX_STANDARD}")
    else ()
        set (CMAKE_CXX_STANDARD 20)
        set (CMAKE_CXX_EXTENSIONS ON) # Same as gnu++2a (ON) vs c++2a (OFF): https://cmake.org/cmake/help/latest/prop_tgt/CXX_EXTENSIONS.html
        set (CMAKE_CXX_STANDARD_REQUIRED ON)
    endif ()
    
    set (CMAKE_C_STANDARD 11)
    set (CMAKE_C_EXTENSIONS ON)
    set (CMAKE_C_STANDARD_REQUIRED ON)
    
    if (COMPILER_GCC OR COMPILER_CLANG)
        # Enable C++14 sized global deallocation functions. It should be enabled by setting -std=c++14 but I'm not sure.
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsized-deallocation")
    endif ()
    
    # falign-functions=32 prevents from random performance regressions with the code change. Thus, providing more stable
    # benchmarks.
    if (COMPILER_GCC OR COMPILER_CLANG)
        set(COMPILER_FLAGS "${COMPILER_FLAGS} -falign-functions=32")
    endif ()
    
    # Compiler-specific coverage flags e.g. -fcoverage-mapping for gcc
    option(WITH_COVERAGE "Profile the resulting binary/binaries" OFF)
    
    if (WITH_COVERAGE AND COMPILER_CLANG)
        set(COMPILER_FLAGS "${COMPILER_FLAGS} -fprofile-instr-generate -fcoverage-mapping")
        # If we want to disable coverage for specific translation units
        set(WITHOUT_COVERAGE "-fno-profile-instr-generate -fno-coverage-mapping")
    endif()
    
    if (WITH_COVERAGE AND COMPILER_GCC)
        set(COMPILER_FLAGS "${COMPILER_FLAGS} -fprofile-arcs -ftest-coverage")
        set(COVERAGE_OPTION "-lgcov")
        set(WITHOUT_COVERAGE "-fno-profile-arcs -fno-test-coverage")
    endif()
    
    set(COMPILER_FLAGS "${COMPILER_FLAGS}")
    
    set (CMAKE_BUILD_COLOR_MAKEFILE          ON)
    set (CMAKE_CXX_FLAGS                     "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS} ${PLATFORM_EXTRA_CXX_FLAG} ${COMMON_WARNING_FLAGS} ${CXX_WARNING_FLAGS}")
    set (CMAKE_CXX_FLAGS_RELWITHDEBINFO      "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 ${CMAKE_CXX_FLAGS_ADD}")
    set (CMAKE_CXX_FLAGS_DEBUG               "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g3 -ggdb3 -fno-inline ${CMAKE_CXX_FLAGS_ADD}")
    
    set (CMAKE_C_FLAGS                       "${CMAKE_C_FLAGS} ${COMPILER_FLAGS} ${COMMON_WARNING_FLAGS} ${CMAKE_C_FLAGS_ADD}")
    set (CMAKE_C_FLAGS_RELWITHDEBINFO        "${CMAKE_C_FLAGS_RELWITHDEBINFO} -O3 ${CMAKE_C_FLAGS_ADD}")
    set (CMAKE_C_FLAGS_DEBUG                 "${CMAKE_C_FLAGS_DEBUG} -O0 -g3 -ggdb3 -fno-inline ${CMAKE_C_FLAGS_ADD}")
    
    if (COMPILER_CLANG)
        if (OS_DARWIN)
            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-U,_inside_main")
        endif()
    
        # Display absolute paths in error messages. Otherwise KDevelop fails to navigate to correct file and opens a new file instead.
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-absolute-paths")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-absolute-paths")
    
        if (NOT ENABLE_TESTS AND NOT SANITIZE)
            # https://clang.llvm.org/docs/ThinLTO.html
            # Applies to clang only.
            # Disabled when building with tests or sanitizers.
            option(ENABLE_THINLTO "Clang-specific link time optimization" ON)
        endif()
    
        # Set new experimental pass manager, it's a performance, build time and binary size win.
        # Can be removed after https://reviews.llvm.org/D66490 merged and released to at least two versions of clang.
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-new-pass-manager")
        set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexperimental-new-pass-manager")
    
        # We cannot afford to use LTO when compiling unit tests, and it's not enough
        # to only supply -fno-lto at the final linking stage. So we disable it
        # completely.
        if (ENABLE_THINLTO AND NOT ENABLE_TESTS AND NOT SANITIZE)
            # Link time optimization
            set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -flto=thin")
            set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -flto=thin")
            set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO} -flto=thin")
        elseif (ENABLE_THINLTO)
            message (${RECONFIGURE_MESSAGE_LEVEL} "Cannot enable ThinLTO")
        endif ()
    
        # Always prefer llvm tools when using clang. For instance, we cannot use GNU ar when llvm LTO is enabled
        find_program (LLVM_AR_PATH NAMES "llvm-ar" "llvm-ar-12" "llvm-ar-11" "llvm-ar-10" "llvm-ar-9" "llvm-ar-8")
    
        if (LLVM_AR_PATH)
            message(STATUS "Using llvm-ar: ${LLVM_AR_PATH}.")
            set (CMAKE_AR ${LLVM_AR_PATH})
        else ()
            message(WARNING "Cannot find llvm-ar. System ar will be used instead. It does not work with ThinLTO.")
        endif ()
    
        find_program (LLVM_RANLIB_PATH NAMES "llvm-ranlib" "llvm-ranlib-12" "llvm-ranlib-11" "llvm-ranlib-10" "llvm-ranlib-9" "llvm-ranlib-8")
    
        if (LLVM_RANLIB_PATH)
            message(STATUS "Using llvm-ranlib: ${LLVM_RANLIB_PATH}.")
            set (CMAKE_RANLIB ${LLVM_RANLIB_PATH})
        else ()
            message(WARNING "Cannot find llvm-ranlib. System ranlib will be used instead. It does not work with ThinLTO.")
        endif ()
    
    elseif (ENABLE_THINLTO)
        message (${RECONFIGURE_MESSAGE_LEVEL} "ThinLTO is only available with CLang")
    endif ()
    
    # Turns on all external libs like s3, kafka, ODBC, ...
    option(ENABLE_LIBRARIES "Enable all external libraries by default" ON)
    
    # We recommend avoiding this mode for production builds because we can't guarantee all needed libraries exist in your
    # system.
    # This mode exists for enthusiastic developers who are searching for trouble.
    # Useful for maintainers of OS packages.
    option (UNBUNDLED "Use system libraries instead of ones in contrib/" OFF)
    
    if (UNBUNDLED)
        set(NOT_UNBUNDLED OFF)
    else ()
        set(NOT_UNBUNDLED ON)
    endif ()
    
    if (UNBUNDLED OR NOT (OS_LINUX OR OS_DARWIN))
        # Using system libs can cause a lot of warnings in includes (on macro expansion).
        option(WERROR "Enable -Werror compiler option" OFF)
    else ()
        option(WERROR "Enable -Werror compiler option" ON)
    endif ()
    
    if (WERROR)
        add_warning(error)
    endif ()
    
    # Make this extra-checks for correct library dependencies.
    if (OS_LINUX AND NOT SANITIZE)
        set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--no-undefined")
        set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined")
    endif ()
    
    include(cmake/dbms_glob_sources.cmake)
    
    if (OS_LINUX OR OS_ANDROID)
        include(cmake/linux/default_libs.cmake)
    elseif (OS_DARWIN)
        include(cmake/darwin/default_libs.cmake)
    elseif (OS_FREEBSD)
        include(cmake/freebsd/default_libs.cmake)
    endif ()
    
    ######################################
    ### Add targets below this comment ###
    ######################################
    
    set (CMAKE_POSTFIX_VARIABLE "CMAKE_${CMAKE_BUILD_TYPE_UC}_POSTFIX")
    
    if (MAKE_STATIC_LIBRARIES)
        set (CMAKE_POSITION_INDEPENDENT_CODE OFF)
        if (OS_LINUX AND NOT ARCH_ARM)
            # Slightly more efficient code can be generated
            # It's disabled for ARM because otherwise ClickHouse cannot run on Android.
            set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fno-pie")
            set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -fno-pie")
            set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-no-pie")
        endif ()
    else ()
        set (CMAKE_POSITION_INDEPENDENT_CODE ON)
    endif ()
    
    # https://github.com/include-what-you-use/include-what-you-use
    option (USE_INCLUDE_WHAT_YOU_USE "Automatically reduce unneeded includes in source code (external tool)" OFF)
    
    if (USE_INCLUDE_WHAT_YOU_USE)
        find_program(IWYU_PATH NAMES include-what-you-use iwyu)
        if (NOT IWYU_PATH)
            message(FATAL_ERROR "Could not find the program include-what-you-use")
        endif()
        if (${CMAKE_VERSION} VERSION_LESS "3.3.0")
            message(FATAL_ERROR "include-what-you-use requires CMake version at least 3.3.")
        endif()
    endif ()
    
    if (ENABLE_TESTS)
        message (STATUS "Unit tests are enabled")
    else()
        message(STATUS "Unit tests are disabled")
    endif ()
    
    enable_testing() # Enable for tests without binary
    
    # when installing to /usr - place configs to /etc but for /usr/local place to /usr/local/etc
    if (CMAKE_INSTALL_PREFIX STREQUAL "/usr")
        set (CLICKHOUSE_ETC_DIR "/etc")
    else ()
        set (CLICKHOUSE_ETC_DIR "${CMAKE_INSTALL_PREFIX}/etc")
    endif ()
    
    message (STATUS
        "Building for: ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_LIBRARY_ARCHITECTURE} ;
        USE_STATIC_LIBRARIES=${USE_STATIC_LIBRARIES}
        MAKE_STATIC_LIBRARIES=${MAKE_STATIC_LIBRARIES}
        SPLIT_SHARED=${SPLIT_SHARED_LIBRARIES}
        UNBUNDLED=${UNBUNDLED}
        CCACHE=${CCACHE_FOUND} ${CCACHE_VERSION}")
    
    include (GNUInstallDirs)
    include (cmake/contrib_finder.cmake)
    
    find_contrib_lib(double-conversion) # Must be before parquet
    include (cmake/find/ssl.cmake)
    include (cmake/find/ldap.cmake) # after ssl
    include (cmake/find/icu.cmake)
    include (cmake/find/xz.cmake)
    include (cmake/find/zlib.cmake)
    include (cmake/find/zstd.cmake)
    include (cmake/find/ltdl.cmake) # for odbc
    # openssl, zlib before poco
    include (cmake/find/sparsehash.cmake)
    include (cmake/find/re2.cmake)
    include (cmake/find/krb5.cmake)
    include (cmake/find/libgsasl.cmake)
    include (cmake/find/cyrus-sasl.cmake)
    include (cmake/find/rdkafka.cmake)
    include (cmake/find/libuv.cmake) # for amqpcpp and cassandra
    include (cmake/find/amqpcpp.cmake)
    include (cmake/find/capnp.cmake)
    include (cmake/find/llvm.cmake)
    include (cmake/find/h3.cmake)
    include (cmake/find/libxml2.cmake)
    include (cmake/find/brotli.cmake)
    include (cmake/find/protobuf.cmake)
    include (cmake/find/grpc.cmake)
    include (cmake/find/pdqsort.cmake)
    include (cmake/find/miniselect.cmake)
    include (cmake/find/hdfs3.cmake) # uses protobuf
    include (cmake/find/poco.cmake)
    include (cmake/find/curl.cmake)
    include (cmake/find/s3.cmake)
    include (cmake/find/base64.cmake)
    include (cmake/find/parquet.cmake)
    include (cmake/find/simdjson.cmake)
    include (cmake/find/fast_float.cmake)
    include (cmake/find/rapidjson.cmake)
    include (cmake/find/fastops.cmake)
    include (cmake/find/odbc.cmake)
    include (cmake/find/nanodbc.cmake)
    include (cmake/find/rocksdb.cmake)
    include (cmake/find/libpqxx.cmake)
    include (cmake/find/nuraft.cmake)
    include (cmake/find/yaml-cpp.cmake)
    
    if(NOT USE_INTERNAL_PARQUET_LIBRARY)
        set (ENABLE_ORC OFF CACHE INTERNAL "")
    endif()
    include (cmake/find/orc.cmake)
    
    include (cmake/find/avro.cmake)
    include (cmake/find/msgpack.cmake)
    include (cmake/find/cassandra.cmake)
    include (cmake/find/sentry.cmake)
    include (cmake/find/stats.cmake)
    include (cmake/find/datasketches.cmake)
    
    set (USE_INTERNAL_CITYHASH_LIBRARY ON CACHE INTERNAL "")
    find_contrib_lib(cityhash)
    
    find_contrib_lib(farmhash)
    
    if (ENABLE_TESTS)
        include (cmake/find/gtest.cmake)
    endif ()
    
    # Need to process before "contrib" dir:
    include (cmake/find/mysqlclient.cmake)
    
    # When testing for memory leaks with Valgrind, don't link tcmalloc or jemalloc.
    
    include (cmake/print_flags.cmake)
    
    if (TARGET global-group)
        install (EXPORT global DESTINATION cmake)
    endif ()
    
    add_subdirectory (contrib EXCLUDE_FROM_ALL)
    
    if (NOT ENABLE_JEMALLOC)
        message (WARNING "Non default allocator is disabled. This is not recommended for production builds.")
    endif ()
    
    macro (add_executable target)
        # invoke built-in add_executable
        # explicitly acquire and interpose malloc symbols by clickhouse_malloc
        # if GLIBC_COMPATIBILITY is ON and ENABLE_THINLTO is on than provide memcpy symbol explicitly to neutrialize thinlto's libcall generation.
        if (GLIBC_COMPATIBILITY AND ENABLE_THINLTO)
            _add_executable (${ARGV} $<TARGET_OBJECTS:clickhouse_malloc> $<TARGET_OBJECTS:memcpy>)
        else ()
            _add_executable (${ARGV} $<TARGET_OBJECTS:clickhouse_malloc>)
        endif ()
    
        get_target_property (type ${target} TYPE)
        if (${type} STREQUAL EXECUTABLE)
            # disabled for TSAN and gcc since libtsan.a provides overrides too
            if (TARGET clickhouse_new_delete)
                # operator::new/delete for executables (MemoryTracker stuff)
                target_link_libraries (${target} PRIVATE clickhouse_new_delete ${MALLOC_LIBRARIES})
            endif()
        endif()
    endmacro()
    
    set(ConfigIncludePath ${CMAKE_CURRENT_BINARY_DIR}/includes/configs CACHE INTERNAL "Path to generated configuration files.")
    include_directories(${ConfigIncludePath})
    
    # Add as many warnings as possible for our own code.
    include (cmake/warnings.cmake)
    
    # Check if needed compiler flags are supported
    include (cmake/check_flags.cmake)
    
    add_subdirectory (base)
    add_subdirectory (src)
    add_subdirectory (programs)
    add_subdirectory (tests)
    add_subdirectory (utils)
    
    include (cmake/print_include_directories.cmake)
    
    include (cmake/sanitize_target_link_libraries.cmake)
    展开全文
  • Linux 命令(69)—— objcopy 命令

    千次阅读 2019-06-17 20:57:47
    需要注意的是 objcopy 能够在两种格式之间拷贝一个完全链接的文件,在两种格式之间拷贝一个可重定位的目标文件可能不会正常地工作。 objcopy 在做转换的时候会创建临时文件,然后将这些临时文件删除。objcopy 使用...
  • objcopy分离符号表.txt

    2021-05-04 12:30:53
    objcopy分离符号表
  • objcopy

    2013-12-21 11:16:00
    objcopy objcopy [options]infile[outfile] Copy the contents of the input object file to another file, optionally changing the file format in the process (but not the endian-ness). Ifoutfileis not...
  • objcopy的详细说明

    千次阅读 2017-04-01 17:01:21
    objcopy把一种目标文件中的内容复制到另一种类型的目标文件中.  (1)将图像编译到可执行文件内 Q: 如何将一个二进制文件,比如图片,词典一类的东西做为.o文件,直接链接到可执行文件内部呢? A:  $ ...
  • gcc的ar,nm,objdump,objcopy

    2018-12-27 10:13:15
    首先简要阐述关于gcc、glibc和 binutils模块之间的关系 一、关于gcc、glibc和binutils模块之间的关系 1、gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及...
  • $ as --32 -o hello.o hello.s $ ld -melf_i386 -o hello hello.o $ objcopy -O binary hello hello.bin 分析转换过后的二进制代码和数据 如果要用 objcopy 做成 Binary 还能运行,怎么办呢? 首先来分析一下,转成...
  • objdump与objcopy使用详解

    千次阅读 2018-10-22 20:37:35
    我们在 Linux 下运行一个程序,有时会无法启动,报缺少某某库。这时需要查看可执行程序或者动态库中的符号表,动态库的依赖项, Linux... Linux 有现成的工具可用: objcopy 。 下面我们来看看具体怎么使用。 objd...
  • objcopy --keep-symbol main --strip-all hello.debug hello2.debug #除了main函数的符号表保留外,其余都删除,这样可以大大减少体积。 由于一个elf文件里面的调试信息和符号信息占用了很大的空间,而这些信息只是...
  • --target= bfdname 明确告诉 Objcopy ,源文件的格式是什么,同时也使用这个格式来写输出文件(即目标文件),也就是说将源目标文件中的内容拷贝到目的目标文件的过程中,只进行拷贝不做格式转换,源目标文件是什么...
  • GNU Objcopy语法和使用

    千次阅读 2018-10-04 11:13:35
    一、GNU Objcopyobjcopy被用来复制一个目标文件的内容到另一个文件中,可以使用不同于源文件的格式来输出目的文件,即可以进行格式转换。 使用的选项参数: input-file、out-file 参数input-file和outfile...
  • 利用objcopy将文本文件(测试用代码文件)编码成二进制文件的段,插入可执行文件中,并直接在代码中访问该文本文件。 平台环境 x86-64 linux 测试代码文件test.c #include <stdio.h> extern char _binary_...
  • linux objcopy command

    2019-05-06 15:35:09
    学习objcopy command. 1.Description   The GNU objcopy utility copies the contents of an object file to another. objcopy uses the GNU BFD Library to read and write the object files. It can write the ...
  • armr5-none-eabi-objcopy -O binary c_project_r5_app0.elf c_project_r5_app0.bin 但是编译出来的bin文件无法运行,排查文件大小,发现bin文件变得非常大,比elf文件还大。 很明显这不对劲,理论来说,elf文件...
  • arm-linux-objcopy arm-linux-objdump ARM Linux ld指令详解_Linux编程_Linux公社-Linux系统门户网站 由于单板资源有限,开发者需要考虑.o文件的组合以及相互调用关系,再者,最后生成的bin文件是要在硬件中运行...
  • gcc/ld/objcopy/objdump命令

    2020-05-18 22:25:45
    all: # arm-linux-gcc -c -o led_on.o... arm-linux-objcopy -O binary -S led_on.elf led_on.bin arm-linux-objdump -D led_on.elf > led_on.dis clean: rm *.bin *.o *.elf arm-linux-gcc arm-linux-gcc -o
  • and call such as <code>i686-w64-mingw32.shared-objcopy can fail. <p>Attempt to first find if the program exists using <code>find_program()</code> and only then call it. <p>Signed-off-by: Lubomir I. ...
  • 而test将只包含调试信息 objcopy --only-keep-debug test test.debug # 从test文件里剥离debug段 objcopy --strip-debug test # 更彻底地,上面这句可以换成下面这句以移除所有的debug信息和符号表 strip -s test #...
  • 转载:... objcopy 复制及修改目标文件 -I : 输入文件的格式(binary, elf32-i386等) -O : 输出文件的格式 -B : 二进制文件体系结构(i386, arm等) -R : 删除不用的secti...
  • objcopy -O binary --pad-to=0x80000 --gap-fill=0xff $SOURCES $TARGET --pad-to=address: 填充输出文件到虚拟地址address。通过增加输出文件中最后一个段的大小,在输出文件中最后一段的末尾和address之间的...
  • arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin 相关参数: -O bfdname 输出的格式 -F bfdname 同时指明源文件,目的文件的格式 -R sectionname 从输出文件中删除掉所有名为sectionname的段 -S 不从...
  • 在linux中输入vi Makefile 来实现创建Makefile文件 **命令行前必须加TAB键 对于led裸机程序,主要是将两个文件led.c和start.S汇编文件,制作一个Makefile文件 ... arm-none-linux-gnueabi-objcopy -O binary
  • Linux ELF文件格式分析—objcopy命令的使用 最近在看《程序员的自我修养—链接、装载与库》一书,对书中提到的一个小问题,自己做了个试验验证一番,然后记录之。其具体问题如下:  如果我们将一个二进制文件,比如...
  • #include extern unsigned char _binary_beau_jpg_start[]; extern unsigned char _binary_beau_jpg_end[];... } objcopy -I binary -O elf64-x86-64 -B i386 image.jpg image.o gcc test.c image.o

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,347
精华内容 5,338
关键字:

objcopy