I am using CMake to cross compile with an arm toolchain and getting a linker error:<div>undefined reference to `__sync_fetch_and_add_4&#39;</div><div><br></div><div>the toolchain has both a shared and static libgcc:</div><div>
<div>./lib/gcc/arm-linux-gnueabi/4.5.2/libgcc.a</div><div>./lib/gcc/arm-linux-gnueabi/4.5.2/libgcc_eh.a</div><div>./arm-linux-gnueabi/lib/libgcc_s.so.1</div><div>./arm-linux-gnueabi/lib/libgcc_s.so</div></div><div><br></div>
<div>the path for both is in the linker directories (from CMakeCXXCompiler.cmake generated in the build directory/CMakeFiles), but the path for the static is first:</div><div>SET(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES &quot;/opt/gatecraft/arm/lib/gcc/arm-linux-gnueabi/4.5.2;/opt/gatecraft/arm/arm-linux-gnueabi/lib;/opt/gatecraft/arm/arm-linux-gnueabi/usr/lib&quot;)</div>
<div><br></div><div>The libraries are not the same, the .so does not have the symbol the linker is complaining about but the .a does (I inspected this with nm). What I can&#39;t figure out is why I can switch the CMAKE_CXX_COMPILER defined in my toolchain file to another toolchain (with the same shared/static and linker path order) - keeping everything else the same - and the build succeeds. I can&#39;t find any significant difference in anything in the build directory between the two, yet one will link libgcc.a (and therefore works) and the other won&#39;t (and gives the error above).</div>
<div><br></div><div>I found that I have a work-around by forcing -static-libgcc in the linker flags, but this doesn&#39;t explain why it works without this change when I switch the compiler to the other toolchain.</div><div>
<br></div><div><br></div><div>Anyone able to explain the discrepancy here and offer a fix?</div>