Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compiling All the Symbols of an Object File as Weak

Tags:

c++

c

gcc

linker

Motivation

I have 2 static libraries, libStatic1.a and libStatic2.a. In addition, I have many SOs (Shared Objects) that compile with libStatic1.a. Up until now, libStatic1.a and libStatic2.a were independent and everything was okay. But now I added to the code that generates libStatic1.a a dependency on the code that generates libStatic2.a. Therefore, any SO that depends on libStatic1.a now needs to be compiled with libStatic2.a. This is undesirable, because it adds a dependency on libStatic2.a to every build targets that depends on libStatic1.a.

only on libStatic1.a now need to compile their code with libStatic2.a in order for the compilation/runtime to succeed/not crash. This creates an unnecessary coupling and I would like to avoid it.

Therefore, I need to somehow "embed" the object code of libStatic2.a in libStatic1.a. If I would just compile libStatic1.a with all the object files of libStatic2.a (in addition to its own), it will basically contain it but this creates another problem- If some user of libStatic1.a will decide to use libStatic2.a and will link it, he will get a weird "multiple definitions" error. If I could somehow tell the compiler to generate the object files of libStatic2.a with weak symbols (only for the use in libStatic1.a) this would solve the problem- no one will get multiple definitions, and no makefile of all the many SOs that use libStatic1.a will need to change.

My thinking: I know that it is possible (using GCC/g++ extensions to the C language) to declare a function with the keyword __attribute__ and the weak attribute as following: void __attribute__((weak)) foo(int j);

Is there a way to tell the compiler (g++) to compile an entire compilation unit as "weak", meaning all its global symbols in the symbol table will be considered weak when linking?

Alternatively, is there a way to tell the linker (ld) to consider all the symbols of some object file/library as if they are weak?

like image 981
infokiller Avatar asked Nov 29 '25 23:11

infokiller


2 Answers

Compile it normally and then objcopy the object file with --weaken.

like image 178
PSkocik Avatar answered Dec 01 '25 12:12

PSkocik


If your library is small, the simplest way is still to change the declarations by adding manually the __attribute__((weak)).

Another possibility might be to ask g++ to spill the assembly code (with -S) and have some (perhaps awkor ed) script work on it.

You could also code a GCC plugin (assuming your g++ is a 4.6 version) or a GCC MELT extension for that.

like image 45
Basile Starynkevitch Avatar answered Dec 01 '25 11:12

Basile Starynkevitch



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!