davecb@yunexus.UUCP (David Collier-Brown) (07/04/89)
In article <321@mountn.dec.com> minow@mountn.UUCP (Martin Minow) writes: | I continue to have difficulty writing transportable programs when | well-meaning implementors use useful words (such as "line" in one | vendor's Macintosh C library). jeffrey@algor2.UUCP (Jeffrey Kegler) writes: | We have a number of worthwhile but conflicting goals involved here. | 1) All libraries should use nice, easy to remember names. | 2) No libraries should use any name any application programmer might | want to use. (Presumably this includes all the nice, easy to remember | ones.) | 3) No library should use a name another library is likely to use. [...] | The only real solution to this problem is something like the renaming | facility that was allowed in ADA. Actually the renaming scheme predates Ada (and Unix!). It was based on the theory that you needed two things to manage the namespace explosion/pollution problem. 1) a set of search rules or search lists for the linker (easy now, not so easy in the V6 era!) 2) a facility to "bind" names in linkable files. The latter is non-obvious (indeed the sufficiency of the scheme isn't obvious at first encounter, either). A "binder" is a program which takes a list of .o files and the names that they should export, and creates a new .o from that. In the simple case, it produces exactly the same effect as "cat"ing all the source files together and declaring all non-interface function static. Or one can write an interface which effectively renames the functions and bind that to the existing .o. It can even be used (twice) to insert a new, identically-named function in to replace say, "fwrite", while calling the real fwrite invisibly down in its guts. Why don't we have such a thing? Well, they can be hard to write, because you have to know the .o format like the back of your hand. (I've written exactly one, and it depended on a bug in the linker I was targeted to, so all I had to do was delete SYMDEF records (:-)). | The renaming could be implemented as a utility that mungs object files | (semi-portable), or as an input file to the loader (completely | unportable) or via pragmas (completely unportable). They're partially portable, as they depend on the .o format, not the actual format of the machine code. As long as someone has ported the compiler & linker, the stock binder can be recompiled with a few -DXYZZY's --dave (just guess where they came from!) c-b -- David Collier-Brown, | davecb@yunexus, ...!yunexus!davecb or 72 Abitibi Ave., | {toronto area...}lethe!dave Willowdale, Ontario, | Joyce C-B: CANADA. 223-8968 | He's so smart he's dumb.