https://sourceware.org/bugzilla/show_bug.cgi?id=22820
Bug ID: 22820 Summary: ICF mismerges two very similar functions Product: binutils Version: 2.30 Status: UNCONFIRMED Severity: normal Priority: P2 Component: gold Assignee: ccoutant at gmail dot com Reporter: steinar+binutils at gunderson dot no CC: ian at airs dot com Target Milestone: --- Hi, We had a fairly bad data dictionary corruption bug in MySQL, which we eventually traced down to gold mistakenly ICF-ing two functions that are actually different. My understanding of the problem is that the two functions are _bytewise_ identical, but since they refer to different constants using %rip-relative addressing, they still would execute differently, and thus should not be merged. Here's a test case (compiled with GCC 7.3): atum17:~/reduce5> cat dictionary_impl.cc #include <string> int func(std::string); int get_actual_P_S_version() { return func("PS_VERSION"); } int get_actual_I_S_version() { return func("IS_VERSION"); } atum17:~/reduce5> g++ -O2 -fPIC -ffunction-sections -fdata-sections -o dictionary_impl.o -c dictionary_impl.cc atum17:~/reduce5> g++ -fuse-ld=gold -Wl,--icf=safe -shared -o dictionary_impl.so dictionary_impl.o atum17:~/reduce5> nm --demangle dictionary_impl.so | grep get_actual 0000000000000a50 T get_actual_I_S_version() 0000000000000a50 T get_actual_P_S_version() So the two functions have received the same address in the binary, and thus were incorrectly merged. -- You are receiving this mail because: You are on the CC list for the bug. _______________________________________________ bug-binutils mailing list bug-binutils@gnu.org https://lists.gnu.org/mailman/listinfo/bug-binutils