Does gcc have any options to add version info in ELF binary file?

后端 未结 4 1300
走了就别回头了
走了就别回头了 2020-12-05 07:55

I mean whether gcc can insert some source code version infor into ELF binary as section or something similar. I do not want to change my source file, but add some info with

相关标签:
4条回答
  • 2020-12-05 08:01

    With the GNU linker ld You can use

    --version-script=version-scriptfile
    

    Read more about the command-line options at: Using LD, the GNU linker - Options

    Read more about creating version scripts at: Using LD, the GNU linker - Version Script

    Let me warn you though, that it is not for the weak-hearted!

    0 讨论(0)
  • 2020-12-05 08:03

    If you don't mind changing your source file just once, add something like this:

    const volatile static char version[] = VERSION;
    

    and compile with:

    gcc -c -DVERSION='"1.2.3"'
    

    The volatile keeps gcc from removing the string at higher optimization levels.

    As written, this won't compile if you forget the -D option, which may be either good or bad depending on your requirements.

    0 讨论(0)
  • 2020-12-05 08:08

    You can emit your version info into a text file, then turn that text file into an object file which you then statically link into your executable.

    The first step is simple but you have to write some code: a script or something to write your version info in any format you like as a plain text file. Then write a makefile rule to produce say version.o from version.txt, using objcopy. Now you'll have an object file with two useful symbols defined in it: the beginning and end of the textual version info. Add that generated object to your executable, and you'll be able to access the version two ways: by running strings on the binary, or by writing code in the application to print the version string (you'll need to declare the start and end symbols as variables in some header file).

    0 讨论(0)
  • 2020-12-05 08:12

    Even if you don't have access to your source anymore, you can link the object with this option:

    gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog
    

    You can check it with hexdump -C prog | less and look for VERSION


    Add this to your makefile and be sure to always know when a program was compiled:

    BUILD = $(shell date +"%Y%m%d_%H%M%S")
    LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0
    
    0 讨论(0)
提交回复
热议问题