views:

564

answers:

9

Windows still use DLLs and Mac programs seem to not use DLL at all. Are they benefits or disadvantages of using either technique?

If a program installation includes all the DLL it requires so that it will work 100% well, will it be the same as statically linking all the libraries?

+12  A: 

MacOS X, like other flavours of Unix, use shared libraries, which are just another form of DLL.

And yes both are advantageous as the DLL or shared library code can be shared between multiple processes. It does this by the OS loading the DLL or shared library and mapping it into the virtual address space of the processes that use it.

cletus
how come mac programs are usually so big, like 27MB or even 106MB?
動靜能量
@Jian Lin - big compared to what?
Russ Cam
@Russ a lot of times, the Windows EXE is very small, like 5MB or 16MB.
動靜能量
Code never weights in tens of megabytes, the difference have to be something else.
alamar
@Jian: Did you compared the same program compiled for windows and for mac?
Andrea Ambu
Many Mac programs are Universal binaries (http://en.wikipedia.org/wiki/Universal_binary), which means they contain the code for multiple architectures.
Joachim Sauer
Gerco Dries
@Jian The typical "Foo.app" is actually a directory containing a bunch of stuff, despite it behaving like an executable when you click it in Finder.
frou
+1  A: 

On Windows, you have to use dynamically-loaded libraries because GDI and USER libraries are avaliable as a DLL only. You can't link either of those in or talk to them using a protocol that doesn't involve dynamic loading.

On other OSes, you want to use dynamic loading anyway for complex apps, otherwise your binary would bloat for no good reason, and it increases the probably that your app would be incompatible with the system in the long run (However, in short run static linking can somewhat shield you from tiny breaking changes in libraries). And you can't link in proprietary libraries on OSes which rely on them.

alamar
+2  A: 

Windows still use DLLs and Mac programs seem to not use DLL at all. Are they benefits or disadvantages of using either technique?

Any kind of modularization is good since it makes updating the software easier, i.e. you do not have to update the whole program binary if a bug is fixed in the program. If the bug appears in some dll, only the dll needs to be updated.

The only downside with it imo, is that you introduce another complexity into the development of the program, e.g. if a dll is a c or c++ dll, different calling conventions etc.

If a program installation includes all the DLL it requires, will it be the same as statically linking all the libraries?

More or less yes. Depends on if you are calling functions in a dll which you assume static linkage with. The dll could just as well be a "free standing" dynamic library, that you only can access via LoadLibrary() and GetProcAddress() etc.

Magnus Skog
+2  A: 

One big advantage of shared libraries (DLLs on Windows or .so on Unix) is that you can rebuild the library and its consumers separately while with static libraries you have to rebuild the library and then relink all the consumers which is very slow on Unix systems and not very fast on Windows.

sharptooth
+1  A: 

MacOS software uses "dll's" as well, they are just named differently (shared libraries).
Dll's make sense if you have code you want to reuse in different components of your software. Mostly this makes sense in big software projects.
Static linking makes sense for small single-component applications, when there is no need for code reuse. It simplifies distribution since your component has no external dependencies.

Florian
A: 

Yes, see this text :

Dynamic linking has the following advantages:
Saves memory and reduces swapping. Many processes can use a single DLL simultaneously, sharing a single copy of the DLL in memory. In contrast, Windows must load a copy of the library code into memory for each application that is built with a static link library.
Saves disk space. Many applications can share a single copy of the DLL on disk. In contrast, each application built with a static link library has the library code linked into its executable image as a separate copy.
Upgrades to the DLL are easier. When the functions in a DLL change, the applications that use them do not need to be recompiled or relinked as long as the function arguments and return values do not change. In contrast, statically linked object code requires that the application be relinked when the functions change.
Provides after-market support. For example, a display driver DLL can be modified to support a display that was not available when the application was shipped.
Supports multilanguage programs. Programs written in different programming languages can call the same DLL function as long as the programs follow the function's calling convention. The programs and the DLL function must be compatible in the following ways: the order in which the function expects its arguments to be pushed onto the stack, whether the function or the application is responsible for cleaning up the stack, and whether any arguments are passed in registers.
Provides a mechanism to extend the MFC library classes. You can derive classes from the existing MFC classes and place them in an MFC extension DLL for use by MFC applications.
Eases the creation of international versions. By placing resources in a DLL, it is much easier to create international versions of an application. You can place the strings for each language version of your application in a separate resource DLL and have the different language versions load the appropriate resources.
A potential disadvantage to using DLLs is that the application is not self-contained; it depends on the existence of a separate DLL module.

lsalamon
Some of these reasons made sense years ago when disk space was expensive. Few do nowadays. I personally prefer to link my apps statically whenever possible.
anon
But in large enterprise systems is more efficient to have separate modules, you must agree?
lsalamon
More efficient in terms of what?
anon
Modularity, it is easier to maintain in smaller pieces.
lsalamon
+1  A: 

Besides memory/disk space usage, another important advantage of using shared libraries is that updates to the library will be automatically picked up by all programs on the system which use the library.

When there was a security vulnerability in the InfoZIP ZIP libraries, an update to the DLL/.so automatically made all software safe which used these. Software that was linked statically had to be recompiled.

sleske
THis is commonly seen as a disadvantage - ever heard of "DLL Hell"?
anon
Yes, but mainly in connection to MS Windows. As far as I can tell, it occurred because MS Windows (used to) lack a proper central package/software manager, like most Linux/BSD systems have. Without the depedency tracking a package manager provides, DLL hell is indeed a problem.But I believed modern Windows versions addressed this.
sleske
Yup - this is now handled by SxS (side by side) installation of DLLs. There can now be multiple copies, so the classic DLL problem (overwriting a DLL by an older version) should no longer happen.
MSalters
A: 

Windows still use DLLs and Mac programs seem to not use DLL at all. Are they benefits or disadvantages of using either technique?

Both use shared libraries, they just use a different name.

If a program installation includes all the DLL it requires so that it will work 100% well, will it be the same as statically linking all the libraries?

Somewhat. When you statically link libraries to a program, you will get a single, very big file, with DLLs, you will have many files.

The statically linked file won't need the "resolve shared libraries" step (which happens while the program loads). A long time ago, loading a static program meant that the whole program was first loaded into RAM and then, the "resolve shared libraries" step happened. Today, only the parts of the program, which are actually executed, are loaded on demand. So with a static program, you don't need to resolve the DLLs. With DLLs, you don't need to load them all at once. So performance wise, they should be on par.

Which leaves the "DLL Hell". Many programs on Windows bring all DLLs they need and they write them into the Windows directory. The net effect is that the last installed programs works and everything else might be broken. But there is a simple workaround: Install the DLLs into the same directory as the EXE. Windows will search the current directory first and then the various Windows paths. This way, you'll waste a bit of disk space but your program will work and, more importantly, you won't break anything else.

One might argue that you shouldn't install DLLs which already exist (with the same version) in the Windows directory but then, you're again vulnerable to some bad app which overwrites the version you need with something that breaks your neck. The drawback is that you must distribute security fixes for your app yourself; you can't rely on Windows Update or similar things to secure your code. This is a tight spot; crackers are making lots of money from security issues and people will not like you when someone steals their banking data because you didn't issue security fixes soon enough.

If you plan to support your application very tightly for many, say, 20 years, installing all DLLs in the program directory is for you. If not, then write code which checks that suitable versions of all DLLs are installed and tell the user about it, so they know why your app suddenly starts to crash.

Aaron Digulla
A: 

From my point of view an shared component has some advantages that are somtimes realized as disadvantages.

  • shared component defines interfaces in your process. So you are forced to decide which components/interfaces are visible outside and which are hidden. This automatically defines which interface has to be stable and which does not have to be stable and can be refactored without affecting any code outside the component..
  • Memory administration in case of C++ and Windows must be well thought. So normally you should not handle memory outside of an dll that isn't freed in the same dll. If you do so your component may fail if: different runtimes or compiler version are used.

So I think that using shared coponents will help the software to get better organized.

Totonga