Opened 8 years ago

Closed 5 years ago

#6443 closed defect (wontfix)

Change linking order in apps/GNUmakefile

Reported by: springmeyer Owned by: warmerdam
Priority: normal Milestone: closed_because_of_github_migration
Component: default Version: unspecified
Severity: normal Keywords:
Cc:

Description

In apps/GNUmakefile the $(LNK_FLAGS) come directly after the linker and before $(CONFIG_LIBS). This makes it impossible to pass custom LDFLAGS that include static archives on linux. Because the linux linker needs to resolve symbols in order the link flags need to come after 'libgdal.a' (which I presume comes in from $(CONFIG_LIBS)) on the linker line.

I see errors like:

libtool: link: clang++-3.5 gdallocationinfo.o -o gdallocationinfo  /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libpq/9.5.2/lib/libpq.a /home/travis/build/mapbox/mason/mason_packages/.build/gdal-2.0.2/.libs/libgdal.a -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/proj/4.9.2/lib -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/expat/2.1.1/lib -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/jpeg_turbo/1.4.2 -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/jpeg_turbo/1.4.2/lib -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libtiff/4.0.6/lib -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libpng/1.6.21 -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libpng/1.6.21/lib -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/zlib/system -L/home/travis/build/mapbox/mason/mason_packages/linux-x86_64/zlib/system/lib -lpthread -lrt -ldl /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libtiff/4.0.6/lib/libtiff.a -L/usr/lib /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/jpeg_turbo/1.4.2/lib/libjpeg.a /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/proj/4.9.2/lib/libproj.a /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/libpng/1.6.21/lib/libpng16.a -lm -lz /home/travis/build/mapbox/mason/mason_packages/linux-x86_64/expat/2.1.1/lib/libexpat.a -pthread
/home/travis/build/mapbox/mason/mason_packages/.build/gdal-2.0.2/.libs/libgdal.a(postgisrasterdataset.o): In function `PostGISRasterDataset::HasSpatialIndex()':
postgisrasterdataset.cpp:(.text+0x9d8): undefined reference to `PQexec'
postgisrasterdataset.cpp:(.text+0xa00): undefined reference to `PQresultStatus'
postgisrasterdataset.cpp:(.text+0xa1f): undefined reference to `PQntuples'
postgisrasterdataset.cpp:(.text+0xad4): undefined reference to `PQclear'

A proposed fix is:

diff --git a/apps/GNUmakefile b/apps/GNUmakefile
index 2f6b749..7d8059c 100644
--- a/apps/GNUmakefile
+++ b/apps/GNUmakefile
@@ -44,97 +44,97 @@ lib-depend:
 	(cd ../port ; $(MAKE) )
 
 gdalinfo$(EXE):	gdalinfo.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdalserver$(EXE):	gdalserver.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdal_translate$(EXE):	gdal_translate.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdaladdo$(EXE):	gdaladdo.$(OBJ_EXT)  $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdalwarp$(EXE): gdalwarp.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdal_contour$(EXE):	gdal_contour.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 nearblack$(EXE):	nearblack.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdalmanage$(EXE):	gdalmanage.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdal_rasterize$(EXE):	gdal_rasterize.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdaltindex$(EXE):	gdaltindex.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdalbuildvrt$(EXE):	gdalbuildvrt.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 multireadtest$(EXE):	multireadtest.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 dumpoverviews$(EXE):	dumpoverviews.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdalenhance$(EXE):	gdalenhance.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdaldem$(EXE): gdaldem.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdal_grid$(EXE):	gdal_grid.$(OBJ_EXT) commonutils.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdalwarpsimple$(EXE): gdalwarpsimple.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdaltransform$(EXE): gdaltransform.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdallocationinfo$(EXE): gdallocationinfo.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdalsrsinfo$(EXE):	gdalsrsinfo.$(OBJ_EXT) commonutils.$(OBJ_EXT)  $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdalflattenmask$(EXE): gdalflattenmask.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdaltorture$(EXE): gdaltorture.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdal2ogr$(EXE):	gdal2ogr.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 ogrinfo$(EXE):	ogrinfo.$(OBJ_EXT) commonutils.$(OBJ_EXT)  $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT)  $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT)  $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 ogrlineref$(EXE):	ogrlineref.$(OBJ_EXT) commonutils.$(OBJ_EXT)  $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT)  $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT)  $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 ogr2ogr$(EXE):	ogr2ogr.$(OBJ_EXT) commonutils.$(OBJ_EXT)  $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 testepsg$(EXE):	testepsg.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 ogrtindex$(EXE):	ogrtindex.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 test_ogrsf$(EXE):	test_ogrsf.$(OBJ_EXT) commonutils.$(OBJ_EXT)  $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< commonutils.$(OBJ_EXT) $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 gdalasyncread$(EXE):	gdalasyncread.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 testreprojmulti$(EXE):	testreprojmulti.$(OBJ_EXT) $(DEP_LIBS)
-	$(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@
+	$(LD) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@ $(LNK_FLAGS)
 
 clean:
 	$(RM) *.o $(BIN_LIST) core gdal-config gdal-config-inst

Change History (3)

comment:1 by Even Rouault, 8 years ago

I terribly suck at makefiles, so I'm not sure to understand all the implications of this change. What if LDFLAGS contained a linker flag (-fPIC etc...) : would that be safe to be put at the end of the command line ?

I've noticed that in the log of your error message, it seems that there was re-ordering of arguments with respect to the initial order given by $(LD) $(LNK_FLAGS) $< $(XTRAOBJ) $(CONFIG_LIBS) -o $@, since "gdallocationinfo.o -o gdallocationinfo" comes in first. I guess this is libtool black magic...

Did you try your change with non-libtool ( ./configure --without-libool ) builds ?

comment:2 by springmeyer, 8 years ago

As per your first question and comment - I'm not sure either. Let me know if you'd like me to test.

Did you try your change with non-libtool ( ./configure --without-libool ) builds ?

I've not tested this change with '--without-libool'. I tried to use '--without-libool' but hit the problem that '--enable-static' was then ignored and a libgdal.a was not produced. Only a libgdal.so. That was a dealbreaker for me. So I've since been trying to work around all the challenges with getting static linking working with libtool. There are a number of over things I needed to do to get libtool builds linking okay. The above patch is the only one I could not find a workaround for. The others I could work around. See the comments at https://github.com/mapbox/mason/blob/8e14adcd9a0571e12f86f2ed54c3a3a1347c6101/scripts/gdal/2.0.2/script.sh#L64-L87.

Overall: I'm able to carry this patch if you are uncomfortable applying. If that is the case, please close this issue.

comment:3 by Even Rouault, 5 years ago

Milestone: closed_because_of_github_migration
Resolution: wontfix
Status: newclosed

This ticket has been automatically closed because Trac is no longer used for GDAL bug tracking, since the project has migrated to GitHub. If you believe this ticket is still valid, you may file it to https://github.com/OSGeo/gdal/issues if it is not already reported there.

Note: See TracTickets for help on using tickets.