[M3devel] SOLsun/libgcc/libsunmath/FloatMode/dynamic linking/..?
Tony Hosking
hosking at cs.purdue.edu
Thu Jun 12 16:51:45 CEST 2008
I think I agree with you here.
On Jun 12, 2008, at 1:23 PM, Jay wrote:
> My inclination on the FloatMode/libsunmath issue is to not build the
> SOLsun FloatMode support, and then see/hope if libsunmath isn't
> otherwise needed, and -z text otherwise "works" -- if the rest of
> the system can be built with it.
> The majority of all platforms and all "current" "active" platforms
> do not implement FloatMode.
> It is a negative trend, but I can go along.
> If that changes, then I'd reconsider.
> Hopefully there is a better libsunmath.a available too though, or a
> better way to implement this, perhaps in assembly, maybe some of
> those new #pragma fenv things..
>
> - Jay
>
> From: jayk123 at hotmail.com
> To: m3devel at elegosoft.com
> Subject: SOLsun/libgcc/libsunmath/FloatMode/dynamic linking/..?
> Date: Thu, 12 Jun 2008 05:04:22 +0000
>
> SOLsun..using cm3cg..
> a bit of a contradiction there?
>
> What SOLsun means:
> Sun cc? Yes.
> Sun ld? I think so.
> Only Sun libs? I think so.
>
> But cm3cg, emits references to functions in libgcc.
> Currently just two trivial functions.
>
> In fact, I am tempted here to give their "spec"
> so someone can provide a "free" (non GPL) implementation.
> Since they get linked into client code.
>
> These functions provide unsigned 64 bit division and modulus.
> Rather than being sensibly named like _uint64div and
> _uint64mod, their names derive from gcc calling "int64"
> a "double integer" or "DI". A "single integer" or "SI" is 32 bits.
>
> The function prototypes are:
>
> unsigned long long __udivdi3 (unsigned long long x, unsigned long
> long y);
> unsigned long long __umoddi3 (unsigned long long x, unsigned long
> long y);
>
> Can someone provide "free" implementations?
> I saw GPLed versions already so I can't.
> I think I provide a hint though.
> They can each be implemented in one line of C.
> As long as the C compiler used
> - "open codes" then
> or - calls out to functions with a different name
>
> Even if the same name is used, there's a possible workaround using
> in-between functions.
>
> These functions are small enough that static linking should be viable.
> Currently they are exported from libm3core.so however.
> Make a separate lib?
> Currently they are in m3-libs/m3core/src/Csupport/libgcc.
> Maybe m3-libs/m3coremath/src?
>
> This would also be required in SOLsun, and nowhere else currently.
>
> There is another "problem" with SOLsun.
> FloatMode.m3 requires libsunmath.a.
> Ideally .so files are "fully" position independent and readonly.
> That is, not merely "relocatable", not merely "patchable" to run
> at any address, but can run at any address and all "patching" is done
> "specially" via something like a "RTOC" and/or "GOT" / "PLT"
> runtime table of contents
> global offset table
> procedute linkage table
> and/or position indepenent addressing modes (for references to self).
>
> Tangent:
> There are a surprisingly number of variables when dynamic linking.
> Many decisions to make as to the exact semantics.
> Are things "delay loaded" aka "statically loaded"?
> When I load m3.so that depends on m3core.so is
> m3core.so loaded immediately?
> Are all the functions that m3.so calls resolved immediately?
> This is a variable one can control through various linker switches.
> As well, for any function that m3core.so calls and implements,
> can either another .so, m3.so, or the executable itself, also
> implement and "replace" or "intercept" or "interpose" those
> functions?
> Again, the answer varies.
> On Windows, the answer is essentially no, not never. Unless you go
> to
> some extra length to allow for it.
> On Unix the answer seems to vary per system and switches.
> Allowing this interception often requires less efficient code.
> And at least in one place resulted in buggy code, that I fixed
> recently,
> I think it was on AMD64_LINUX. Going through the indirection
> mechanism, the PLT,
> trashes the static link in rcx, or something like that.
> And it is just unnecessary indirection in almost all cases.
> So, the questions become, what do people want/expect for Modula-3?
> And, does it vary from person to person? System to system?
> Windows is "never" going to allow the interposition.
> Allowing "interposition" also goes by the description "allow
> unresolved symbols in shared objects", to be resolved at load time.
> Unix often has one global namespace for all functions in a process.
> Apple has a similar thing between "one level namespaces" and "two
> level namespaces".
> In an older release, they had only one level namespace. Every
> dynamically imported
> function would be searched for in all dynamically loaded files.
> Usually at build time you know the name of the shared object you
> expect to find
> the function in. So you can have a "two level namespace" where
> function names
> are associated with a particular file name, and only that file is
> searched.
> Apple encourages this usage, though of course is bound somewhat by
> compatibility.
> You can perhaps still build binaries that run on 10.0, and
> binaries built to run
> on 10.0 in the first place can still run today.
> The need to do either of these is always diminishing but hard to
> deem zero.
>
> SOLsun linker has two related switches.
> libsunmath.a apparently is not built fully position independent.
> libm3core.so must link to it, and therefore does not have a fully
> read only text section.
>
> what to do?
>
> A few options:
> Go back to allowing unresolved symbols in SOLsun, enabling
> "interposition".
> Then I think libsunmath.a isn't used by .sos, just executables.
> I don't like this option. Binding functions to particular file
> names (not paths)
> seems right and is encouraged by Apple and about the only option
> on Windows.
> It seems good to use when available.
>
> Allow writable text section in all .so.
> This is what I commited.
>
> Allow writable text section in only libm3core.so.
> This is a better compromise than previous.
>
> Move FloatMode.m3 into a separate so... libm3coremath.so,
> and only let it have a writable text section.
> This is a better compromise in terms of amount of writable text,
> but also
> adds another .so. The fewer .sos the better, arguably.
>
> Change FloatMode.m3 somehow to not use libsunmath.a.
> I think the only way to do this is to make it do nothing at all,
> which
> is probably what most of the implementations do, but I'd have to
> check.
> FloatMode.m3 is generally implementable on many systems, like via
> _controlfp
> on NT386. It is also dangerous to be mucking with the floating
> mode --
> what code in the process depends on the default and will be
> broken by it changing?
>
> Worse, the SPARC implementation has a comment saying it is
> implemented process-wide
> instead of per-thread. Really there are arguments either way.
>
> The "common" implementation just asserts false.
> DS3100, VAX, IRIX, SPARC, SUN386, implement FloatMode.
> NT386, *_DARWIN, *_LINUX, *_FREEBSD, SOLgnu do not.
>
> Maybe just turn it off for SOLsun too?
> or go through and provide it everywhere? Always per-thread if
> possible?
> Only on pthreads implementations preferably?
> (I'm not a fan of user threads in general, so don't wish to make
> them "better".)
>
> I think removing FloatMode for SOLsun is probably the way to go.
> See if that removes requirement on libsunmath.a.
> See if that then allows fully position independent and "resolved"
> symbols.
>
> And maybe there is an updated libsunmath.a?
> I just have a "random" version of Solaris 10 from eBay.
> I could try a newer OpenSolaris/Nevada version.
>
> Or drop SOLsun as uninteresting?
> (My internet is slow as I said. I finally finished downloading
> the "normal" gcc and can build it and try the more active SOLgnu
> instead.)
>
> That would at least ease figuring out the names of:
> I386_SOLARIS, AMD64_SOLARIS, SPARC64_SOLARIS
>
> no need to have two of these of those. :)
>
> And is SOLgnu meant to use GNU ld or not?
> It looks like not. SOLsun and SOLgnu config files are "the same"
> here.
> Could be GNU ld is compatible in command line usage though.
>
> (not yet -- I almost have the 64 bit hosted cm3cg bug figured out.
> it occurs the same on SPARC64_OPENBSD as AMD64_LINUX. Something about
> assignment being DImode vs. VOIDmode. Occurs in many places,
> including
> RTRuntimeError.Self, by virtue of it using TRY.)
>
> - Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20080612/cfbf7ab0/attachment-0002.html>
More information about the M3devel
mailing list