Mein GCC kompiliert ungefragt Debug-Symbole ein!



  • Servus,

    ich hab hier folgendes Problem: Über die SuSe-Paketverwaltung hab ich mal bei mir alles auf den neuesten Stand gebracht.
    Ich hab aktualisiert von gcc 4.2 und qt 4.3.1
    auf gcc 4.3.1 und qt 4.4.3

    Seitdem werden meine Binaries 10 mal so groß wie vorher. Habe nun im Ausschlussverfahren Qt oder irgendwelche statisch gelinkten Bibliotheken ausgeschlossen. Es liegt am gcc. Bei identischen Makefiles erzeugt er auf meinem einen Rechner mit der alten Version kleine binaries ohne debug-symbole, auf meinem aktualisierten System sind die binaries 10-mal so groß, wenn ich dann aber

    strip --strip-debug meinelib.a
    

    mache, ist das binary wieder genauso klein. Jetzt wüsste ich gerne, warum bei identischen Makefiles einmal mit und einmal ohne debug kompiliert wird.

    Das Makefile (gekürzt):

    #############################################################################
    # Makefile for building: libvaslib.a
    # Generated by qmake (2.01a) (Qt 4.4.3) on: Mi Nov 12 19:20:08 2008
    # Project:  vaslib.pro
    # Template: lib
    # Command: /usr/bin/qmake -unix -o Makefile vaslib.pro
    #############################################################################
    
    ####### Compiler, tools and options
    
    CC            = gcc
    CXX           = g++
    DEFINES       = -DQT_NO_DEBUG -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_SHARED
    CFLAGS        = -pipe -O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -O2 -g -Wall -W -fPIC -D_REENTRANT $(DEFINES)
    CXXFLAGS      = -pipe -O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -O2 -g -Wall -W -fPIC -D_REENTRANT $(DEFINES)
    INCPATH       = -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include/QtNetwork -I/usr/include/QtNetwork -I/usr/include/QtGui -I/usr/include/QtGui -I/usr/include/QtXml -I/usr/include/QtXml -I/usr/include -I. -I.
    AR            = ar cqs
    RANLIB        = 
    QMAKE         = /usr/bin/qmake
    TAR           = tar -cf
    COMPRESS      = gzip -9f
    COPY          = cp -f
    SED           = sed
    COPY_FILE     = $(COPY)
    COPY_DIR      = $(COPY) -r
    INSTALL_FILE  = install -m 644 -p
    INSTALL_DIR   = $(COPY_DIR)
    INSTALL_PROGRAM = install -m 755 -p
    DEL_FILE      = rm -f
    SYMLINK       = ln -sf
    DEL_DIR       = rmdir
    MOVE          = mv -f
    CHK_DIR_EXISTS= test -d
    MKDIR         = mkdir -p
    
    ####### Output directory
    
    OBJECTS_DIR   = ./
    
    ####### Files
    
    SOURCES       = assert.cpp \
    		config.cpp \
    		configwidget.cpp \
    ....blablabla
    
    OBJECTS       = assert.o \
    		config.o \
    		configwidget.o \
    
    ... blablabla ....
    
    DIST          = /usr/share/qt4/mkspecs/common/g++.conf \
    		/usr/share/qt4/mkspecs/common/unix.conf \
    		/usr/share/qt4/mkspecs/common/linux.conf \
    		/usr/share/qt4/mkspecs/qconfig.pri \
    		/usr/share/qt4/mkspecs/features/qt_functions.prf \
    		/usr/share/qt4/mkspecs/features/qt_config.prf \
    		/usr/share/qt4/mkspecs/features/exclusive_builds.prf \
    		/usr/share/qt4/mkspecs/features/default_pre.prf \
    		/usr/share/qt4/mkspecs/features/release.prf \
    		/usr/share/qt4/mkspecs/features/default_post.prf \
    		/usr/share/qt4/mkspecs/features/warn_on.prf \
    		/usr/share/qt4/mkspecs/features/staticlib.prf \
    		/usr/share/qt4/mkspecs/features/static.prf \
    		/usr/share/qt4/mkspecs/features/qt.prf \
    		/usr/share/qt4/mkspecs/features/unix/thread.prf \
    		/usr/share/qt4/mkspecs/features/moc.prf \
    		/usr/share/qt4/mkspecs/features/resources.prf \
    		/usr/share/qt4/mkspecs/features/uic.prf \
    		/usr/share/qt4/mkspecs/features/yacc.prf \
    		/usr/share/qt4/mkspecs/features/lex.prf \
    		vaslib.pro
    QMAKE_TARGET  = vaslib
    DESTDIR       = ../lib/
    TARGET        = libvaslib.a
    
    first: all
    ####### Implicit rules
    
    .SUFFIXES: .o .c .cpp .cc .cxx .C
    
    .cpp.o:
    	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
    
    .cc.o:
    	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
    
    .cxx.o:
    	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
    
    .C.o:
    	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
    
    .c.o:
    	$(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
    
    ####### Build rules
    
    all: Makefile ../lib/$(TARGET) 
    
    staticlib: ../lib/$(TARGET)
    
    ../lib/$(TARGET): ui_waypointchoosedlg.h ui_routedlg.h ui_infodlg.h ui_chart.info.dlg.h ui_latlonpointdlg.h ui_pbdpointdlg.h ui_textelemdlg.h $(OBJECTS) $(OBJCOMP) 
    	@$(CHK_DIR_EXISTS) ../lib/ || $(MKDIR) ../lib/ 
    	-$(DEL_FILE) $(TARGET)
    	$(AR) $(TARGET) $(OBJECTS)
    	-$(DEL_FILE) ../lib/$(TARGET)
    	-$(MOVE) $(TARGET) ../lib/
    
    Makefile: vaslib.pro  /usr/share/qt4/mkspecs/default/qmake.conf /usr/share/qt4/mkspecs/common/g++.conf \
    		/usr/share/qt4/mkspecs/common/unix.conf \
    		/usr/share/qt4/mkspecs/common/linux.conf \
    		/usr/share/qt4/mkspecs/qconfig.pri \
    		/usr/share/qt4/mkspecs/features/qt_functions.prf \
    		/usr/share/qt4/mkspecs/features/qt_config.prf \
    		/usr/share/qt4/mkspecs/features/exclusive_builds.prf \
    		/usr/share/qt4/mkspecs/features/default_pre.prf \
    		/usr/share/qt4/mkspecs/features/release.prf \
    		/usr/share/qt4/mkspecs/features/default_post.prf \
    		/usr/share/qt4/mkspecs/features/warn_on.prf \
    		/usr/share/qt4/mkspecs/features/staticlib.prf \
    		/usr/share/qt4/mkspecs/features/static.prf \
    		/usr/share/qt4/mkspecs/features/qt.prf \
    		/usr/share/qt4/mkspecs/features/unix/thread.prf \
    		/usr/share/qt4/mkspecs/features/moc.prf \
    		/usr/share/qt4/mkspecs/features/resources.prf \
    		/usr/share/qt4/mkspecs/features/uic.prf \
    		/usr/share/qt4/mkspecs/features/yacc.prf \
    		/usr/share/qt4/mkspecs/features/lex.prf \
    		/usr/lib/libQtXml.prl \
    		/usr/lib/libQtCore.prl \
    		/usr/lib/libQtGui.prl \
    		/usr/lib/libQtNetwork.prl
    	$(QMAKE) -unix -o Makefile vaslib.pro
    /usr/share/qt4/mkspecs/common/g++.conf:
    /usr/share/qt4/mkspecs/common/unix.conf:
    /usr/share/qt4/mkspecs/common/linux.conf:
    /usr/share/qt4/mkspecs/qconfig.pri:
    /usr/share/qt4/mkspecs/features/qt_functions.prf:
    /usr/share/qt4/mkspecs/features/qt_config.prf:
    /usr/share/qt4/mkspecs/features/exclusive_builds.prf:
    /usr/share/qt4/mkspecs/features/default_pre.prf:
    /usr/share/qt4/mkspecs/features/release.prf:
    /usr/share/qt4/mkspecs/features/default_post.prf:
    /usr/share/qt4/mkspecs/features/warn_on.prf:
    /usr/share/qt4/mkspecs/features/staticlib.prf:
    /usr/share/qt4/mkspecs/features/static.prf:
    /usr/share/qt4/mkspecs/features/qt.prf:
    /usr/share/qt4/mkspecs/features/unix/thread.prf:
    /usr/share/qt4/mkspecs/features/moc.prf:
    /usr/share/qt4/mkspecs/features/resources.prf:
    /usr/share/qt4/mkspecs/features/uic.prf:
    /usr/share/qt4/mkspecs/features/yacc.prf:
    /usr/share/qt4/mkspecs/features/lex.prf:
    /usr/lib/libQtXml.prl:
    /usr/lib/libQtCore.prl:
    /usr/lib/libQtGui.prl:
    /usr/lib/libQtNetwork.prl:
    qmake:  FORCE
    	@$(QMAKE) -unix -o Makefile vaslib.pro
    
    dist: 
    	@$(CHK_DIR_EXISTS) .tmp/vaslib1.0.0 || $(MKDIR) .tmp/vaslib1.0.0 
    	$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/vaslib1.0.0/ && $(COPY_FILE) --parents ptrlist.h assert.h config.h 
    ...blablabla ...
    
     .tmp/vaslib1.0.0/ && $(COPY_FILE) --parents assert.cpp config.cpp 
    ...blablabla ...
    
     .tmp/vaslib1.0.0/ && $(COPY_FILE) --parents waypointchoosedlg.ui routedlg.ui infodlg.ui chart.info.dlg.ui latlonpointdlg.ui pbdpointdlg.ui textelemdlg.ui .tmp/vaslib1.0.0/ && (cd `dirname .tmp/vaslib1.0.0` && $(TAR) vaslib1.0.0.tar vaslib1.0.0 && $(COMPRESS) vaslib1.0.0.tar) && $(MOVE) `dirname .tmp/vaslib1.0.0`/vaslib1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/vaslib1.0.0
    
    clean:compiler_clean 
    	-$(DEL_FILE) $(OBJECTS)
    	-$(DEL_FILE) *~ core *.core
    
    ####### Sub-libraries
    
    distclean: clean
    	-$(DEL_FILE) $(TARGET) 
    	-$(DEL_FILE) Makefile
    
    mocclean: compiler_moc_header_clean compiler_moc_source_clean
    
    mocables: compiler_moc_header_make_all compiler_moc_source_make_all
    
    compiler_moc_header_make_all: moc_config.cpp 
    ....
    
    compiler_moc_header_clean:
    	-$(DEL_FILE) moc_config.cpp ...
    moc_config.cpp: assert.h \
    		config.h
    	/usr/bin/moc $(DEFINES) $(INCPATH) config.h -o moc_config.cpp
    
    ... und weitere Abhängigkeiten der moc-files....
    
    compiler_rcc_make_all:
    compiler_rcc_clean:
    
    ...blabla, alle möglichen Resourcen die noch durch den Resourcencompiler gejagt werden müssen...
    
    compiler_clean: compiler_moc_header_clean compiler_uic_clean 
    
    ####### Compile
    
    assert.o: assert.cpp assert.h \
    		logger.h
    	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o assert.o assert.cpp
    
    ... und sämtliche Abhängikeiten aller .o-Files ....
    
    moc_config.o: moc_config.cpp 
    	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_config.o moc_config.cpp
    
    ####### Install
    
    install:   FORCE
    
    uninstall:   FORCE
    
    FORCE:
    

    Sodele, und mein gcc gibt folgendes aus:

    gcc -v
    Using built-in specs.
    Target: i586-suse-linux
    Configured with: ../configure --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib --libexecdir=/usr/lib --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.3 --enable-ssp --disable-libssp --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --with-slibdir=/lib --with-system-zlib --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --program-suffix=-4.3 --enable-version-specific-runtime-libs --enable-linux-futex --without-system-libunwind --with-cpu=generic --build=i586-suse-linux
    Thread model: posix
    gcc version 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] (SUSE Linux)
    

    Alle sachdienlichen Hinweise erwünscht!

    Gruß,



  • Wenn ich das richtig sehe, wird in der Makefile für CXXFLAGS und CFLAGS der GCC-Parameter -g gesetzt, der nichts anderes macht, als die Generierung von Debug-Symbolen anzuschalten. Womöglich steht dies in einem direkten kausalen Zusammenhang mit Deinem Problem... 🙂



  • Und wenn Du die Makefile von qmake erzeugen läßt, ist es auch wichtig, was in der .pro-Datei steht. Wenn dort sowas wie "CONFIG += debug" drinne steht, dann erzeugt qmake eine Makefile mit gesetztem -g Parameter für die CXXFLAGS und CFLAGS.



  • Und wenn Du die Makefile von qmake erzeugen läßt, ist es auch wichtig, was in der .pro-Datei steht. Wenn dort sowas wie "CONFIG += debug" drinne steht, dann erzeugt qmake eine Makefile mit gesetztem -g Parameter für die CXXFLAGS und CFLAGS.



  • Dr. Tux schrieb:

    Und wenn Du die Makefile von qmake erzeugen läßt, ist es auch wichtig, was in der .pro-Datei steht. Wenn dort sowas wie "CONFIG += debug" drinne steht, dann erzeugt qmake eine Makefile mit gesetztem -g Parameter für die CXXFLAGS und CFLAGS.

    So siehts aus, ich schreibe kilometerlange Makefiles ungerne von Hand, sondern lasse es mir von qmake erzeugen. Nun sind im dazu notwendige .pro-File bereits die release-Option an und die debug-option ausgeschaltet. Unter Windows und auf Mac kommt dann auch genau das raus was soll, nämlich eine optimierte release-Version, aber hier auf der Linux-Kiste leider nicht.

    Das .pro:

    TEMPLATE = lib
    QT += network xml
    
    CONFIG += qt staticlib warn_on windows release
    CONFIG -= rtti exceptions stl thread debug
    TARGET = vaslib
    
    DESTDIR = ../lib
    TARGET.path = .
    
    INSTALLS += TARGET
    
    DEPENDPATH += .
    LIBS += -L"../lib"
    
    #QMAKE_CC = ccache gcc
    #QMAKE_CXX = ccache g++
    #QMAKE_CXXFLAGS += -Wextra
    #QMAKE_CXXFLAGS_DEBUG += -Wextra
    
    #
    # "profile" configuration that enables profiling with gprof
    #
    profile {
        QMAKE_CXXFLAGS += -pg -g -O3 -DNDEBUG
        QMAKE_LFLAGS += -pg -g
    }
    
    ####################
    
    RC_FILE = vaslib.rc
    
    ...
    jetzt resourcen, headers, sources, forms...
    

    Gruß,
    Phil



  • Du könntest unter /usr/share/qt4/mkspecs in den Ordner linux-g++, linux-g++-32 oder linux-g++-64 und common nachschauen, ob in den dort liegenden *.conf-Dateien ungewöhnliche Einträge stehen. Ich hatte es mal bei einer QT-Version, da konnte man keine Debug-Symbole einkompilieren. (Also das genaue Gegenteil Deines Problems.) Da mußte dann eine Datei unter /usr/share/qt4/mkspecs/common angepaßt werden und dann ging das. Möglich, daß das auch hier ein Problem ist.



  • Also unter /usr/share/qt4/mkspecs/common
    steht in der g++.conf

    QMAKE_CFLAGS_RELEASE    += -O2 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -O2 -g
    QMAKE_CFLAGS_DEBUG      += -g
    

    Das wird das Problem sein, oder? Es steht beidesmal -g.

    Danke für den Tipp!



  • Super, jetzt werden meine binaries wieder schön kuschelig klein!

    Danke!


Anmelden zum Antworten