FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

What to do about non-standard .so names?

 
Post new topic   Reply to topic     Forum Index -> Derelict
View previous topic :: View next topic  
Author Message
aldacron



Joined: 05 May 2004
Posts: 1322
Location: Seoul, South Korea

PostPosted: Wed Oct 27, 2004 4:38 am    Post subject: What to do about non-standard .so names? Reply with quote

I recall Clayasaurus posted some time ago about different names for the OpenGL shared libraries on Mepis. Today, as I was getting DerelictSDL compiling and running on my new Mepis install, the sdlbitmap test program kept crashing because it couldn't load libSDL.so (which also pointed out a nasty bug in Derelict). A bit of snooping showed me that the SDL shared lib on my system is names libSDL-1.2.so.0.7.0, with a symbolic link called libSDL-1.2.so.0.

Aside from the fact that I think this is a ridiculous naming convention, the question of how to handle this situation in the general case now becomes a major issue for the Linux port. There's no telling what kooky sort of names are on the path of an end-user's system (presinstalled or otherwise). Obviously, requiring Derelict apps to ship with custom .so files is out - I know that doesn't fly in the Linux world (and could be quite complex with dependencies).

The first thing that pops into my head is that the Load functions for each package require a file name as a parameter. This puts the onus on the app. It also eliminates the possiblilty of automatically loading stuff in the module constructors if exceptions ever get fixed.

The next thing I think of is a configuration file. Each Derelict package can ship with sensible default lib names in the config file, and the end-user will be responsible for configuring the appropriate shared lib names if they are non-standard. Since most Linux users are used to fiddling with config files, this is not as bad of an option as it would be on Windows. It also opens the door to add other configurable features to the Derelict packages (which would then start taking Derelict out of the scope of 'direct binding'). Alternatively, the end-user could be required to create a libSDL.so symlink if they have a nonstandard name. Not too keen on that, though.

The third and final option I came up with is for Derelict to automatically scan the system for the appropriate file name if the default fails to load. If a lib is found, it's name is cached and used from thence forward until it fails to load again. This would eliminate the need for the end-user to configure anything, and would allow Derelict to automatically catch something like libSDL.1.2.so.0 when it is upgraded to libSDL.1.3.so.0, for example. The drawback is that we must assume that all SDL libraries will contain SDL and .so, and all OpenGL libraries will contain GL and .so. And what happens if Joe Blow releases joesGL.so one day? Or Steve Davis releases libSDLib.so? Too many was this approach could break.

So for now, I'm favoring the config file approach. Before I implement it, however, I'd like some feedback. Does anyone have any other options they can think of? Is the config file a bad idea?

At any rate, I've got the fixes in my local copy for SDL to compile and run on Linux when libSDL.so is present. I also need to go back and fix up each package to handle the case of a missing shared lib (I thought I had done that already!). I've converted the DerelictSDL Makefile to Makefile.linux, but I'm reconsidering this before I commit it. First of all, I'm thinking about zapping the makefiles altogether and going with SCons. I realize that this will require the developer to install both Python and Scons, but I think it's a small price to pay. And no, I won't use both approaches. If I continue to maintain two makefiles for each package, then there's no reason to use SCons in the first place. So, no linux commits until I get this sorted.
Back to top
View user's profile Send private message Send e-mail
JJR



Joined: 22 Feb 2004
Posts: 1104

PostPosted: Wed Oct 27, 2004 9:50 am    Post subject: Re: What to do about non-standard .so names? Reply with quote

aldacron wrote:
I recall Clayasaurus posted some time ago about different names for the OpenGL shared libraries on Mepis. Today, as I was getting DerelictSDL compiling and running on my new Mepis install, the sdlbitmap test program kept crashing because it couldn't load libSDL.so (which also pointed out a nasty bug in Derelict). A bit of snooping showed me that the SDL shared lib on my system is names libSDL-1.2.so.0.7.0, with a symbolic link called libSDL-1.2.so.0.


I think the naming convention is standard for all Linuxes... The long versioning in the names of the shared libraries is what I believe is called a fully qualified soname. It's necessary to differentiate the different versions from each other. The system usually makes a symbolic link "libsdl.so" which points to the current version.

In your case, that link probably wasn't present because perhaps you were the one that compiled and installed the SDL library(?); you probably didn't add the libsdl.so symbolic link to the fully qualified name. I don't think you would have had any issues loading up the correct SDL library through the symbolic link otherwise.

I'm no expert on these things, but I've run into these issues before. Once you understand how it works, I believe it's fairly straightforward. When you install a newly compiled library on your system, you typically have to take some basic steps to make sure it works. Since I don't want to confuse you on this one, here's a link to a tutorial that explains the gcc linker, shared libraries, and ldconfig quite well:

http://www.tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

I'm guessing that the library author (ie, sdl or mesagl) must make the symbolic link to their fully qualified library name when the library is being installed or compiled on the target system. Something like:

ln -s /usr/lib/libsdl-1.2.0.so /usr/lib/libsdl.so

This creates a filesystem link named "libsdl.so" that points to the fully-qualified name "libsdl-1.2.0.so." Both names reside in the /usr/lib directory (assuming that's where libsdl-1.2.0.so was installed).

This is probably included in the "make install" script. The linux distribution may also do this for all included libraries upon user installation of the system.

aldacron wrote:
Aside from the fact that I think this is a ridiculous naming convention, the question of how to handle this situation in the general case now becomes a major issue for the Linux port. There's no telling what kooky sort of names are on the path of an end-user's system (presinstalled or otherwise). Obviously, requiring Derelict apps to ship with custom .so files is out - I know that doesn't fly in the Linux world (and could be quite complex with dependencies).


It may seem obsure and annoying at first, but I think once you see the purpose of the shared library naming format, everything will work out without you having to resort to complicated solutions. One of the benefits of the linux system is that, in contrast to windows, you don't need an import library. You just add the -lglu or -lsdl option on the command line of your compile; as long as you have your symobolic link correctly set up, the shared library will be "connected" to your program.

In the case of dynamic loading without manual linkage, it should work quite well also as long as the symbolic link is set up priorly. When the loader makes the call to symbolic link, the fully qualified library name is loaded.

If your program is dependent on very specific version of SDL, then I imagine this may be the situation where you must not rely on the symbolic link. But in this age of dynamic libraries, it's probably safest to query for the installed library version first anyway before attempting to load functions from it. I guess there will be several versions of SDL available, new and old, so you can never be assured that's what's on the system unless you are the one that installed it. But I think this is no different an issue than what you'll find with windows dll's anyway.

If the system that is using your Derelict libary does not have a symbolic link to the most recent SDL, it means either:

a) SDL is not installed properly
b) Someone, either the installation software or the administrator, failed to make the appropriate symbolic link.
c) The distribution is not following standard filesystem setup procedures(?)

aldacron wrote:
...


Maybe this will help. I'm not sure. I'm NOT an expert on this and perhaps should have not written too much on it lest I make the issue worse. Yet I've overviewed the problems before, so I know enough to get me in and out of trouble Wink.

Good luck,

John
Back to top
View user's profile Send private message
JJR



Joined: 22 Feb 2004
Posts: 1104

PostPosted: Wed Oct 27, 2004 10:29 am    Post subject: Reply with quote

After reviewing the link I submitted above, I realize that my explanation wasn't quite accurate in spots. For a clearer explanation, stick to the link! Confused
Back to top
View user's profile Send private message
aldacron



Joined: 05 May 2004
Posts: 1322
Location: Seoul, South Korea

PostPosted: Wed Oct 27, 2004 8:25 pm    Post subject: Re: What to do about non-standard .so names? Reply with quote

After reading the article you posted it would appear that symlinks to lib*.so are the non-standard. The dynamic linker ignores the version number in lib*.so.x, so there's no need to include it when linking, for example, -lSDL. This explains why there's no libSDL.so symlink on Mepis.

So the problem still remains, though the focus is different from what I initially believed. Derelict needs a standard way to load the shared lib manually. Unlike the linker, dlopen will not load libSDL-1.2..so.0 for libSDL.so. And if libSDL.so is not standard, what then should Derelict do?
Back to top
View user's profile Send private message Send e-mail
JJR



Joined: 22 Feb 2004
Posts: 1104

PostPosted: Thu Oct 28, 2004 9:27 am    Post subject: Re: What to do about non-standard .so names? Reply with quote

Just to make sure the definitions are laid out:

[Linker name]
> lib*.so == symlink to a shared library so name; no file size; merely an fs alias; setup up by linux distribution or installation program; used by linker to link

[so name]
> lib*.so.x == symlink to a shared library real name; no file size; merely an fs alias; setup by ldconfig automatically

[real name]
> lib*so.x.x == actual library containing dynamically loadable object code

Also the link option -llibrary in gcc will load exactly what you specify as library. It merely surrounds it with the necessary "lib" and postfix '.a' or '.so' as described from the gcc manual:

gcc 3.4.2 manual wrote:
The linker searches a standard list of directories for the library, which is actually a file named liblibrary.a. The linker then uses this file as if it had been specified precisely by name.


"linker" names symlinked to more specific library versions are quite common: libSDL-1.2.so so you could also use with the -l option.

aldacron wrote:
After reading the article you posted it would appear that symlinks to lib*.so are the non-standard. The dynamic linker ignores the version number in lib*.so.x, so there's no need to include it when linking, for example, -lSDL. This explains why there's no libSDL.so symlink on Mepis.


I'm not quite following you. I'm not sure whether lib*.so aka the "linker name" is a standard but it is a common technique and I THINK it is standard. In Linux it is so common, that implementing might as well be a standard procedure. The article states:

ARTICLE wrote:
ldconfig doesn't set up the linker names; typically this is done during library installation, and the linker name is simply created as a symbolic link to the ``latest'' soname or the latest real name. I would recommend having the linker name be a symbolic link to the soname, since in most cases if you update the library you'd like to automatically use it when linking.


and (remembering linker name == "lib*.so")

ARTICLE wrote:
I asked H. J. Lu why ldconfig doesn't automatically set up the linker names. His explanation was basically that you might want to run code using the latest version of a library, but might instead want development to link against an old (possibly incompatible) library. Therefore, ldconfig makes no assumptions about what you want programs to link to, so installers must specifically modify symbolic links to update what the linker will use for a library.


If installers set up the linker name, it seems like it's pretty standard to me that a linker name symlink be present.

This is why the linker name lib*.so works when you are linking to a shared library with -lSDL. It follows the symlinked (in the file system prespective) lib*.so to the soname or real name.

Are you saying that you can link using -lSDL on Mepis, and it finds the correct shared library soname or realname EVEN though you don't have the libSDL.so symlink present in /usr/lib or /usr/local/lib? I didn't know that was possible. From the information I've gathered, I don't think that's how it works. I can't experiment right now without my linux running.

aldacron wrote:
So the problem still remains, though the focus is different from what I initially believed. Derelict needs a standard way to load the shared lib manually. Unlike the linker, dlopen will not load libSDL-1.2..so.0 for libSDL.so. And if libSDL.so is not standard, what then should Derelict do?


On the linux filesystem:

[linker name] --> [so name] --> [real name]
libSDL.so --> libSDL-1.2.so.0 --> libSDL-1.2.so.x.x (actual concrete file)

both linker name and so name are filesystem symlinks to the real name.
The purpose of the linker name is for linking the library into applications. The so name is for ldconfig to manage caching and multiple minor library versions. The real name is the actual library.

So derelict can't make a call to dlopen with libSDL.so as the argument? It would just require that you do the symlink first. A check for the existance of the correct library on the system would be necessary anyway. If Derelict depends on a specific version fo SDL than it would have to load the specific "so name" anyway. Can't the dlopen function load an so name properly?

What I think should be done:

1) check for file libSDL.so (the linker name) or libSDL-1.2.so (Notice: not appending '0' differentiating it from an "so name." Linux often has several more specific linker names to help with version linking).

2) if not present check for the required version of libSDL-1.2.so.x (if I understand correctly, derelict will have to have a basic SDL version requiremnt anyway since the programmer must know which version he's interfacing with through derelict).

4) if libSDL-1.2.so.0 (so name) is not present then "Houston, we have a problem..." and output an error message "SDL not present"

5) otherwise proceed to load "so name" library with dlopen.

I guess what it comes down to is I should just get into playing with the derelict linux source and see what the issues are. I may be wasting my time pretending to know the solution to the problem without actually playing with derelict myself. For that I apologize. Razz

- John


Last edited by JJR on Thu Oct 28, 2004 9:40 am; edited 1 time in total
Back to top
View user's profile Send private message
JJR



Joined: 22 Feb 2004
Posts: 1104

PostPosted: Thu Oct 28, 2004 9:36 am    Post subject: Reply with quote

Actually, perhaps I should modify one of my steps above. Trying to load the "so name" may be quite hard because the variances in interface revision numbers as indicated by the number appended at the end "libSDL-1.2.so.0". That's why the existance of linker names are probably so critical. If just a libSDL-1.2.so is present then we know we are loading the basic functionality we need. Multiple semi-specific linker names are often present. I imagine it's designed to be that way. It would be nice if a seasoned linux developer could comment on this more.

Later,

John
Back to top
View user's profile Send private message
aldacron



Joined: 05 May 2004
Posts: 1322
Location: Seoul, South Korea

PostPosted: Thu Oct 28, 2004 8:05 pm    Post subject: Re: What to do about non-standard .so names? Reply with quote

JJR wrote:

Are you saying that you can link using -lSDL on Mepis, and it finds the correct shared library soname or realname EVEN though you don't have the libSDL.so symlink present in /usr/lib or /usr/local/lib? I didn't know that was possible. From the information I've gathered, I don't think that's how it works. I can't experiment right now without my linux running.


No, I didn't read the entire article Embarassed I skimmed throught the first couple of paragraphs and walked away with the wrong impression.

Quote:

[linker name] --> [so name] --> [real name]
libSDL.so --> libSDL-1.2.so.0 --> libSDL-1.2.so.x.x (actual concrete file)

both linker name and so name are filesystem symlinks to the real name.
The purpose of the linker name is for linking the library into applications. The so name is for ldconfig to manage caching and multiple minor library versions. The real name is the actual library.


Yeah, the concept of symlinks I get. What I'm trying to get at here is that, on a fresh Mepis install, there are no 'linker name' symlinks. At least, for the version of Mepis I installed. Clayasaurus made a post about this in another thread wrt OpenGL. I have no symlinks named libSDL.so (or libSDL-1.2.so), libGL.so, etc... All I have are the so names and the real names. I don't know if this is a side effect of installing through apt-get or if this is just something Debian/Mepis do.
Back to top
View user's profile Send private message Send e-mail
JJR



Joined: 22 Feb 2004
Posts: 1104

PostPosted: Fri Oct 29, 2004 12:31 am    Post subject: Re: What to do about non-standard .so names? Reply with quote

aldacron wrote:
Yeah, the concept of symlinks I get. What I'm trying to get at here is that, on a fresh Mepis install, there are no 'linker name' symlinks. At least, for the version of Mepis I installed. Clayasaurus made a post about this in another thread wrt OpenGL. I have no symlinks named libSDL.so (or libSDL-1.2.so), libGL.so, etc... All I have are the so names and the real names. I don't know if this is a side effect of installing through apt-get or if this is just something Debian/Mepis do.


Okay, I see what you are saying. Perhaps the reason is that the linker names are not necessary unless one is developing with those libraries. If you installed Mepis as a "user" system, there would be no need for the linker names to be setup during the installation process by default. Perhaps if there were a developer installation option, it would have set up some of those for you.

Another thing to consider: often times those libraries won't be installed until you download a game or program package that requires them. If you are downloading them as binary only packages, once again linker names are NOT likely to be made (only the so name and real names are necessary from the ready-made apps perspective). Source based package installations, on the other hand, will probably install the linker names for SDL and OpenGL, merely because they will have to link to these libraries in order compile. So have you tried that? Have you downloaded a game source with dependencies on the SDL SDK? Well I guess you don't even need to do that. Go straight to the SDL SDK. Does Mepis allow you to download SDL as a source implementation?

That's my best guess at the problem. I don't think Mepis is acting out of character in this regard, as far as linuxes go. I've used Gentoo Linux for quite a while. It's inherently a source-based system, where you compile everything yourself (but it makes it easy). The advantage for me here is that I probably will never have a shortage of linker names! Smile

Anyway, try not to get too frustrated. It is a different world than Windows, that's for sure. And it's no utopia. Just a different form of agony. Smile ( Believe me, there's a lot of things that are simpler to do on linux, though).

Later,

John


Last edited by JJR on Mon Nov 08, 2004 1:01 pm; edited 2 times in total
Back to top
View user's profile Send private message
aldacron



Joined: 05 May 2004
Posts: 1322
Location: Seoul, South Korea

PostPosted: Fri Oct 29, 2004 1:31 am    Post subject: Re: What to do about non-standard .so names? Reply with quote

JJR wrote:

Okay, I see what you are saying. Perhaps the reason is that the linker names are not necessary unless one is developing with those libraries. If you installed Mepis as a "user" system, there would be know need for the linker names to be setup during the installation process by default. Perhaps if there were a developer installation option, it would have set up some of those for you.


Now the picture gets clearer Smile I hadn't considered that. And the install process was quite different from other distros I've used. With RedHat I would have chosen Workstation or Custom, then on the package selection screen I would have chosen Development Tools. Mepis gave me no such options, IIRC. It was a very simple, very quick install process.
[/quote]

Another thing to consider: often times those libraries won't be installed until you download a game or program package that requires them. If you are downloading them as binary only packages, once again linker names are NOT likely to be made (only the so name and real names are necessary from the ready-made apps perspective). Source based package installations, on the other hand, will probably install the linker names for SDL and OpenGL, merely because they will have to link to these libraries in order compile. So have you tried that? Have you downloaded a game source with dependencies on the SDL SDK? Well I guess you don't even need to do that. Go straight to the SDL SDK. Does Mepis allow you to download SDL as a source implementation?
[/quote]

Yes, I could go download, compile and install SDK if I wanted to. But aside from the missing linker names, I really like going through apt-get to install the binary packages. It makes things so much easier to get rid of once I don't need/want them anymore. One thing I've always hated about Linux is how typing 'make install' can drop files all over your system and there's no way I can keep up with which files belong to which app/lib. If a package manager can do it for me, I'm using it.

Quote:

Anyway, try not to get too frustrated. It is a different world than Windows, that's for sure. And it's no utopia. Just a different form of agony. Smile ( Believe me, there's a lot of things that are simpler to do on linux, though).


Frustration has always sent me back to Windows Smile That, or me screwing things up somehow. Now though, I'm much more comfortable with everything. The fact that the install was so smooth helps a lot. Plus, having an actual project to work on gives me all the more reason to stick with it. Too bad Dark Age of Camelot doesn't have a Linux version.

So rather than stress over missing linker names, I'm just going to create symlinks for those I need as I need them. I'll keep using linker names in Derelict for now. If we ever need to get more aggressive and look for so names or something then I'll handle it then. I'll just include notes in each package's README that Derelict requires linker names on the user's system.
Back to top
View user's profile Send private message Send e-mail
JJR



Joined: 22 Feb 2004
Posts: 1104

PostPosted: Fri Oct 29, 2004 8:42 am    Post subject: OT: Running Windows Games on Linux Reply with quote

aldacron wrote:
JJR wrote:

Anyway, try not to get too frustrated. It is a different world than Windows, that's for sure. And it's no utopia. Just a different form of agony. Smile ( Believe me, there's a lot of things that are simpler to do on linux, though).


Frustration has always sent me back to Windows Smile That, or me screwing things up somehow. Now though, I'm much more comfortable with everything. The fact that the install was so smooth helps a lot. Plus, having an actual project to work on gives me all the more reason to stick with it. Too bad Dark Age of Camelot doesn't have a Linux version.


Ha! I'm an expert on messing Linux systems up. It's a wonder how I can stick with it. I've reinstalled various distributions so many times... well... it gets depressing just to think about. But, I guess, my curiosity gets the better of me and eventually I get back into it again.

The Camelot game has quite the eye-catching renderings. All I can say is that if it's OpenGL based, it's very likely that it can run on Linux under WINE. I think that almost all the OpenGL based windows games that I have tried run extremely well under wine as is.

If your game's DirectX3D based, well things aren't so promising unless you buy a Transgaming subscription. They develop a souped-up version of WINE with DirectX 9 (I think?) support. It's in continual development and supports more games all the time (many recently released ones too).

I did a check on that game at the transgamer site and apparently someone has been successful in running it under Transgamer's WINE. I've had various amounts of success with Transgamer. Some games have worked, while others have played uselessly slow. I've mostly experimented with non-supported games, so I guess it's no surprise if they don't work well. I'm a flight sim fan, myself, but it doesn't look like support for those kind of games is very popular.

aldacron wrote:
So rather than stress over missing linker names, I'm just going to create symlinks for those I need as I need them. I'll keep using linker names in Derelict for now. If we ever need to get more aggressive and look for so names or something then I'll handle it then. I'll just include notes in each package's README that Derelict requires linker names on the user's system.


Sounds like an excellent idea. Documenting the install requirements in the README should be quite sufficient for now.

-John
Back to top
View user's profile Send private message
clayasaurus



Joined: 21 May 2004
Posts: 857

PostPosted: Fri Oct 29, 2004 11:51 am    Post subject: Re: What to do about non-standard .so names? Reply with quote

aldacron wrote:

Frustration has always sent me back to Windows Smile That, or me screwing things up somehow. Now though, I'm much more comfortable with everything. The fact that the install was so smooth helps a lot. Plus, having an actual project to work on gives me all the more reason to stick with it. Too bad Dark Age of Camelot doesn't have a Linux version.

So rather than stress over missing linker names, I'm just going to create symlinks for those I need as I need them. I'll keep using linker names in Derelict for now. If we ever need to get more aggressive and look for so names or something then I'll handle it then. I'll just include notes in each package's README that Derelict requires linker names on the user's system.


Ok. derelict will just use standard libSDL.so type names and it'll be up to the users to make the links? As long as it's documented in a readme/install file i guess it'll work. i wouldn't mind it probing the system to figure out the .so name though.

Also, about frustration, how about this. installing windows, update to service pack 1 and 2 (restart until its done), set up firewall, install openoffice or ms office, set up dmd, install gl drivers from nvidias site since the windows upgrade ones don't work (unsigned). Also, for some reason windows xp runs my programs alot slower than linux. linux i get 500 fps, windows around 80 for the same program. When i restart under windows, it takes a couple minutes for it to do it. using any program is slow, if i get viruses removing those is a pain.

Yea, ok. So linux isn't super user friendly (well maybe Mepis is Smile ) and programs/hardware are usually not "made for linux." At least its not the "OS" for viruses, it comes with decent software, you don't have to worry about Activation and unsigned drivers, and it doesn't run any slower than it has to.
Back to top
View user's profile Send private message AIM Address
aldacron



Joined: 05 May 2004
Posts: 1322
Location: Seoul, South Korea

PostPosted: Fri Oct 29, 2004 7:23 pm    Post subject: Re: What to do about non-standard .so names? Reply with quote

clayasaurus wrote:

Also, about frustration, how about this. installing windows, update to service pack 1 and 2 (restart until its done),


No need to install SP 1 if you are installing SP2.

Quote:
install gl drivers from nvidias site since the windows upgrade ones don't work (unsigned).


You should always use the latest drivers from Nvidia's site anyway, particularly if you're a gamer. The drivers you get through Windows Update will be ot of date.

Quote:
Also, for some reason windows xp runs my programs alot slower than linux. linux i get 500 fps, windows around 80 for the same program. When i restart under windows, it takes a couple minutes for it to do it. using any program is slow,


I'm not seeing this. If you have 256 MB of RAM or less, that could be contributing to poor performance. The other thing is that the firewall might be screwing things up. I have mine turned off. Also, you can always CTRL-ALT-DEL and see how much CPU time and memory each process is using. When I installed PC-Cillin, which I got for free with the new system, it started a firewall behind my back that scanned every single network packet for viruses. That took a while to figure out. It killed the performance of online games and web surfing. The other thing is that one of the utilities it installed constantly ate 99? of my CPU time, 75? of my RAM, and would always run at startup no matter how many times I configured it not to. If you have PC-Cillin installed (or another program that's hogging resources - some apps don't play well with SP2), then that could be the culprit.

Quote:

Yea, ok. So linux isn't super user friendly (well maybe Mepis is Smile ) and programs/hardware are usually not "made for linux." At least its not the "OS" for viruses, it comes with decent software, you don't have to worry about Activation and unsigned drivers, and it doesn't run any slower than it has to.


Nothing wrong with Linux Wink It just takes some getting used to. I will likely always prefer Windows simply because I've been using it for years.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic     Forum Index -> Derelict All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group