英文:
Linux file stripped, but still holds information it shouldn't
问题
I have a program which I stripped of all symbols, and confirmed as follows:
file /usr/local/mypapp
/usr/local/myapp: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=0f9f3c44a5bbbaefb0a64306e981323f5655e873, for GNU/Linux 3.2.0, stripped
My program contains a runtime error (Qt signal name is wrong), and at runtime the following error is written to the system log:
QObject::connect: No such signal RunProcessAsync::sig_write(ELevelWarning, Types::ESources, quint64, QString) in /mnt/myserver/data/development/myapp/src/external-sharedfiles/systemcommands/testfile.cpp:60
So it would appear the full name of the source file, the function call, and the class name are all still in the executable! How / why? The file is supposed to be stripped?
英文:
I have a program which I stripped of all symbols, and confirmed as follows:
file /usr/local/mypapp
/usr/local/myapp: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=0f9f3c44a5bbbaefb0a64306e981323f5655e873, for GNU/Linux 3.2.0, stripped
My program contains a runtime error (Qt signal name is wrong), and at runtime the following error is written to the system log:
QObject::connect: No such signal RunProcessAsync::sig_write(ELevelWarning, Types::ESources, quint64, QString) in /mnt/myserver/data/development/myapp/src/external-sharedfiles/systemcommands/testfile.cpp:60
So it would appear the full name of the source file, the function call, and the class name are all still in the executable! How / why? The file is supposed to be stripped?
答案1
得分: 2
正如Alan在上面所说,strip不会改变调试消息。strip的作用是从二进制文件中删除调试符号 - 这些是调试器(如gdb)使用的数据,存储在二进制文件的特殊部分。另一方面,调试消息是诸如qDebug()之类的内容,其中一些是由Qt的connect()函数自动生成的。使用编译标志QT_NO_DEBUG_OUTPUT将禁用这些消息。
你还应该考虑使用连接的较新语法,该语法使用模板在编译时验证连接语句,这将更容易防止像消息中标记的这样的错误。
英文:
As Alan said above, strip doesn't change debug messages. What strip does is remove debugging symbols from the binary - these are data used by debuggers such as gdb and are stored in special sections of a binary. Debug messages on the other hand are things like qDebug() and some of these are generated automatically for you by Qt's connect() function. Using the build flag QT_NO_DEBUG_OUTPUT will disable these messages.
You should also consider using the newer syntax for connect that uses templates to validate your connect statements at compile time. This will make it easier to prevent errors such as the one that message is flagging.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论