<div dir="ltr">I am trying to use LLVM to get the IR for a whole program. The program's Makefile is somewhat complicated so I have written wrappers which emit LLVM IR at every step in the process instead of ELF object files and executables. My problem is that during linking, I get "multiple definition" errors. Here is a small example:<div><br></div><div><font face="monospace, monospace">file: a.c </font></div><div><font face="monospace, monospace">---------</font></div><div><font face="monospace, monospace">int f_a(int m) { return m + 1; }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">file: b.c</font></div><div><font face="monospace, monospace">----------</font></div><div><font face="monospace, monospace">int f_a(int);</font></div><div><font face="monospace, monospace">int f_b(int n) { return f_a(n); }</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">file: driver.c </font></div><div><font face="monospace, monospace">--------------</font></div><div><font face="monospace, monospace">int f_b(int);</font></div><div><font face="monospace, monospace">int main(int argc, char *argv[]) {</font></div><div><font face="monospace, monospace">  return f_b(argc);</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">$ clang -flto -Wl,-plugin-opt=emit-llvm -shared -o libA.so a.c</font></div><div><font face="monospace, monospace">$ clang -flto -Wl,-plugin-opt=emit-llvm -shared -o libB.so b.c -L. -lA</font></div><div><font face="monospace, monospace">$ clang -flto -Wl,-plugin-opt=emit-llvm -o driver driver.c -L. -lA -lB</font></div><div><br></div><div>All the .so files here are obviously now bitcode files. The last command fails with a "multiple definition" error because both libB.so and libA.so contain a definition for f_a. </div><div><br></div><div>My question is: Is there a way to have the linker only import the definitions from shared objects when linking the final executable and in all other cases just use the declaration? Or, is there a way to get the linker to pick one of several identical definitions? </div><div><br></div><div>Thanks,</div><div><br></div><div>Tarun</div><div><br></div></div>