Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

紧急求助:报错 symbol lookup error: /usr/local/lib/libbrpc.so: undefined symbol: pthread_mutex_lock #2266

Closed
tangtang5156 opened this issue May 30, 2023 · 7 comments
Labels
bug the code does not work as expected

Comments

@tangtang5156
Copy link

tangtang5156 commented May 30, 2023

Describe the bug (描述bug)
运行可执行文件时报错symbol lookup error: /usr/local/lib/libbrpc.so: undefined symbol: pthread_mutex_lock

To Reproduce (复现方法)
尝试多种使用方法,发现在如下场景下可复现报错:
1、编译产出libhttpserver.so(使用c++开发),该so依赖brpc,cmake选项如下:
set(DYNAMIC_LIB
# ${CMAKE_THREAD_LIBS_INIT}
${GFLAGS_LIBRARY}
${PROTOBUF_LIBRARIES}
${LEVELDB_LIB}
${OPENSSL_CRYPTO_LIBRARY}
${OPENSSL_SSL_LIBRARY}
# ${THRIFT_LIB}
# ${THRIFTNB_LIB}
dl
)
TARGET_LINK_LIBRARIES(httpserver proto brpc ${DYNAMIC_LIB} pthread)
(此时直接使用httpserver链接到其他可执行文件时不会报错)

2、产出B.so(使用c开发),B.so使用到了httpserver中的功能,故依赖了httpserver.so,cmake选项如下:
ADD_LIBRARY(B SHARED jiangdan.c)
TARGET_LINK_LIBRARIES(B httpserver)

3、产出可执行文件main(使用c开发),main中使用到了B.so的功能,故依赖了B.so,同时C中使用到了pthread的功能,也依赖了pthread,cmake选项如下(已经将B放在pthread的前面):
ADD_EXECUTABLE(main main.c)
TARGET_LINK_LIBRARIES(main B pthread)

4、此时编译项目即cmake ..&& make结果正常,但是运行main时会报错:
symbol lookup error: /usr/local/lib/libbrpc.so: undefined symbol: pthread_mutex_lock

Expected behavior (期望行为)
测试过程发现,若可执行文件直接依赖httpserver和pthread时不会报错,可正常运行;但是只要中间再多层依赖,这种方式就会报错。但是项目依赖方很多,其他项目均是依赖httpserver做二次so的开发,无法规避多层依赖问题。
预期:执行main时可正常执行。不管是通过链接静态brpc还是动态brpc,只要有解决方式即可。
已排查了多天无果,紧急求助。

Versions (各种版本)
OS: linux ubuntu
Compiler:
brpc: 尝试了几个版本包括最新的1.5.0均会报错
protobuf:

Additional context/screenshots (更多上下文/截图)
其他尝试的解决方案,比如动态brpc改为静态brpc,仍然无法解决,过程如下:
1、为解决上述问题,尝试将httpserver链接静态brpc,如:
TARGET_LINK_LIBRARIES(httpserver proto libbrpc.a ${DYNAMIC_LIB} pthread)
修改后再重新执行main,不再提示brpc缺失,而是提示依赖libbrpc.a的httpserver.so缺失:
symbol lookup error: /usr/local/lib/libhttpserver: undefined symbol: pthread_mutex_lock

2、为解决问题1,则尝试将brpc.a的所有符号均链接进来,如
TARGET_LINK_LIBRARIES(httpserver proto "-Wl,--whole-archive" libbrpc.a "-Wl,--no-whole-archive" ${DYNAMIC_LIB} pthread)
修改后再重新执行main,代码直接段错误崩溃,debug后发现崩溃点在于如下图:
image
image

@wwbmmm
Copy link
Contributor

wwbmmm commented May 30, 2023

@tangtang5156
Copy link
Author

tangtang5156 commented May 30, 2023

https://github.com/apache/brpc/blob/master/src/bthread/mutex.cpp#L818 注释掉这两个函数试试

您好,我已注释掉这两个函数,如图:
image
清空build目录后,重新执行cmake -DBUILD_SHARED_LIBS=1 -DBUILD_STATIC_LIBS=1 -B build && cmake --build build -j6 编译出了新的libbrpc.so & libbrpc.a,将其拷贝到系统目录后重新执行可执行文件,仍然报错:
symbol lookup error: /usr/local/lib/libbrpc.so: undefined symbol: pthread_mutex_lock
image
另外附上nm截图,注释前:
1685496538162_AF094A68-16BA-4f4d-88DD-08CA7E0906B4
注释掉指定方法后:
image

辛苦再帮忙看下,非常感谢!

@wwbmmm
Copy link
Contributor

wwbmmm commented May 31, 2023

@tangtang5156
Copy link
Author

tangtang5156 commented May 31, 2023

再注释掉这个全局变量试试 https://github.com/apache/brpc/blob/master/src/bthread/mutex.cpp#L428

您好,在之前回复的去除pthread_mutex_lock和pthread_mutex_unlock的基础上我又注释掉了上述的全局变量,具体如下:
image

注释掉之后运行主函数没有再报错了。
但是因为毕竟去除了一部分brpc的代码,担心会影响后续的其他使用。所以再请教下,这部分代码注释掉之后的具体影响是什么哪?比如会导致哪些功能不可用,或者是在什么场景下可能会有问题?
辛苦回复,感谢!

@wwbmmm
Copy link
Contributor

wwbmmm commented May 31, 2023

会导致内置服务中的contention profiler不可用

@tangtang5156
Copy link
Author

tangtang5156 commented May 31, 2023

会导致内置服务中的contention profiler不可用

了解了。那我们暂不开启这个功能,先用去除掉这部分代码的brpc调试。
另外麻烦再问下,上述问题是否有可能通过其他用户端的代码改造或者是配置改造的方式来规避?
辛苦回复

@chenBright
Copy link
Contributor

@tangtang5156 可以试试使用LD_PRELOAD=/path/to/libbrpc.so启动程序看有没有问题

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug the code does not work as expected
Projects
None yet
Development

No branches or pull requests

3 participants