Okay, you obviously are at least in charge of final linking and the one object that contains, if nothing else, the lib_archive() function.

How do you make the determination of which archiving function to use? If it's logical, then why not just have lib_archive() figure it out and then call lib_archive_cdr() or lib_archive_dvdr() or lib_archive_ftp() or lib_archive_nfs()? That way you don't have to deal with any of this mess.
When the program's compiled, it needs ONE *.so file, and that compiled exec is stuck with that *.so file?
That one.

However:
can I have one of the differently named *.so files (like lib_cdr.so, lib_dvd.so, lib_ftp.so, etc etc..) in the lib directory, and will the executable try whatever file is in there until it finds a lib_archive()
I don't understand your question here. If your intent is to have a different one for each possibility, wouldn't each of them have a lib_archive() in it? Or were you planning to move them in and out of there as needed?
_________________________
Bitt Faulk