bmk icon indicating copy to clipboard operation
bmk copied to clipboard

How to append linker options?

Open GWRon opened this issue 3 years ago • 5 comments

I was asked to get my game running on an ancient Linux (32bit, GLIBC <= 2.17).

I compiled NG's bcc and bmk with the help of vanilla bcc (and some adjustments). Some modules (GC stuff and some other in brl.mod) failed to compile with the ancient GCC (4.8 or 4.9 - tried on Cent OS 7 and Debian 8 MX 15).

So I compiled my own GCC (7.5) with the configure settings taken from my Mint setup.

The resulting binary (yeah!) failed to find CXXABI_1.3.9 - and strings found only up to CXXABI_1.3.8 in the system files (libstdc++.so.6).

I found out that one can append -static-libstdc++ to the g++ command doing the linking part after compilation. (yet I was not able to test the final binary - as it now blames the lack of hardware acceleration in my VM ... )

How can I define this to happen here - did not spot the right place in "custom.bmk" or "make.bmk" (bmk_utils.bmx does not seem to append custom/configurable stuff)

g++ -m32 -no-pie -fpie -pthread -o /home/.../TVTower /home/.../BlitzMax.NG/tmp/ld.tmp -L/usr/lib32 -L/usr/X11R6/lib -L/usr/lib
->
g++ -m32 -no-pie -fpie -pthread -static-libstdc++ -o /home/.../TVTower /home/.../BlitzMax.NG/tmp/ld.tmp -L/usr/lib32 -L/usr/X11R6/lib -L/usr/lib

GWRon avatar Dec 14 '21 15:12 GWRon

You could try adding an ld_opts option...

setldopt static-stdc -static-libstdc++

But it doesn't let you specify the order it is added.

woollybah avatar Dec 14 '21 22:12 woollybah

It's also possible to use makebootstrap to generate bcc/bmk sources that can be used as a base to compile on a particular system. You tweak the bootstrap.cfg file with the target platform, and you'll need bcc and bmk in the src dir. And the run something like :

./bmk makebootstrap

Creates a dist dir which you can zip up and drop onto a system. Then run one of the build scripts in bcc/bmk to generate an executable. eg.

source bmk.console.release.linux.x86.build

woollybah avatar Dec 14 '21 22:12 woollybah

setldopt (or addldopt) seems to be ignored somehow ... will investigate and report back (so you can do something else meanwhile). bmk_make.bmx:

print "Linking options:"
print globals.Get("ld_opts").ToString()

LinkApp opt_outfile, links, makelib, globals.Get("ld_opts")

custom.bmk

setldopt static-stdc -static-libstdc++
addldopt static-stdc -static-libstdc++
$ ./bmk makeapp -r -v /home/ronny/Arbeit/Projekte/TVTower/Current/TVTower.bmx
[100%] Linking:TVTower
Linking options:
 -static-libstdc++ -static-libstdc++
g++ -m64 -no-pie -fpie -pthread -o /home/ronny/Arbeit/Projekte/TVTower/Current/TVTower /home/ronny/Arbeit/Tools/BlitzMaxNG/tmp/ld.tmp -L/usr/X11R6/lib -L/usr/lib
Loading post.bmk

Regarding the makebootstrap - yeah surely an option too, but I think in this scenario the "ld_opts" are versatile enough (once working). Thanks for the suggestion though.

GWRon avatar Dec 15 '21 16:12 GWRon

Saw this in bmk_util.bmx (linkapp - for win32):

		If usingLD
			If opts.Find("stdc++") = -1 Then
				fb.Append(" -lstdc++")
			End If

Wouldn't it then be better to search for "-lstdc++" (to avoid skipping appending -lstdc++ when using "static-libstdc++" ? (did not check if the static-libstdc++ already inclused -lstdc++ ... or if there are other params containing "stdc++")

GWRon avatar Dec 15 '21 16:12 GWRon

Regarding "ld_opts": they are ignored on linux ...

bmk_util.bmx - linkapp():

	If processor.Platform() = "macos" Or processor.Platform() = "osx" Then
...
		If opts Then
			sb.Append(" ").Append(opts)
		End If

	If processor.Platform() = "win32"
...
		' add any user-defined linker options
		fb.Append(" ").Append(opts)

		' add any user-defined linker options, again - just to cover whether we missed dependencies before.
		fb.Append(" ").Append(opts)

	If processor.Platform() = "linux" Or processor.Platform() = "raspberrypi" Or processor.Platform() = "haiku"
...
	If processor.Platform() = "android" Then
...
	If processor.Platform() = "emscripten"
...
		sb.Append(" ").Append(opts)

	If processor.Platform() = "nx" Then
        EndIf
...
	Local t$=getenv_( "BMK_LD_OPTS" )
	If t 
		sb.Append(" ").Append(t)
	EndIf

I truncated the code a bit to make it easier to spot where "opts" is not used. Also it shows that on Windows, you append the options twice. Dunno if the first could be removed? Or if this can raise issues when used twice (so you'd better kinda "split" what can be added before and what needs to come afterwards)

GWRon avatar Dec 15 '21 16:12 GWRon