Question

Dynamic and static linking.

Asked by: shajithchandran

hi,
I want to creat dll in linux.

Suppose that one C code file has a function (eg square()).
I want to use this code through linking.

Now when i write some application i will do this

#include<square.h>

int main()
{

square();
...
}

That is i want to learn how to do dynamic and static linking. I have no prior knowledge so please explain in detail.
 I want to know every thing which is required to do this.

Thanks
shaj

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2003-08-26 at 21:58:10ID20721083
Topic

C Programming Language

Participating Experts
5
Points
500
Comments
13

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. static STL objects in MFC extension DLLs
    I have an extension DLL class which contains a static STL map object: class AFX_EXT_CLASS SomeDLLClass { static map<int,int> sm_SomeMap; //etc. }; Within an application I try to make a copy of this object: map<int,int> localMap(SomeDllClass::sm_SomeMap); Thi...
  2. Static DLL
    I want to know if I can specify the path of a static DLL at runtime..something like.. Function Test; external TestPath+'TEST.DLL'; but as is TestPath must be a constant...any ideas?

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: pankajtiwaryPosted on 2003-08-27 at 01:25:11ID: 9230504

Well dlls in windows are equivalent to your so (shared objects) in linux. Static objects have .o extensions. To produce the statically linked library (or rather object) you can compile the .c file (which contains the definition of square()) with a -c flag.

prompt> cc -c square.c

This will produce an statically linked library file square.o

now compile the main file(lats say main.c) the same way.

cc -c main.c

which will produce main.o. Now you can link the two object files (main.o and square.o) to produce the executable binary. Or alternatively you can directly do

cc main.c square.o to produce the a.out executable.

For a full reading...you can refer http://www-106.ibm.com/developerworks/library/l-shobj/

 

by: reckPosted on 2003-08-27 at 07:51:00ID: 9232875

First of all, dll's are called so file under linux. These are dynamic libraries. The static libraries are called .a files.

I'll explain creating and using .a files first since this is easier.
.a files are actually a collection of object (.o) files.

Suppose you have a .c file which contains the square() routine. You want to make a static library containing this routine.
You just do:

gcc -c square.c                  --> This will give you an object file (square.o)

To create your static library, you do:

ar -r square.a square.o            --> This will give you a static library file (square.a)

The -r option says to insert new files into the archive, which is square.a.

Suppose you want to use the routine in anotherfile, say test.c, you don't need to include the square.h file.

First you compile the c file:

gcc -c test.c

Then you link the file, with the static library

gcc -o test test.o square.a

This is all there is to creating and using static libraries...

Creating and using .so files is a bit more complicated.

First you compile your source files:

gcc -c test.c                  --> This gives you the object file test.o
gcc -c square.c                  --> This gives you the object file square.o

Then you create your dynamic library:

gcc -shared -o libsquare.so square.o      --> This gives you the dynamic library libsquare.so

To use it you don't include the .h file, but you link your program against your library:

gcc -o test test.o -L. -lsquare

The -o option specifies the output file (executable).
The -L option specifies the path to the shared library (In this case the current directory)
The -l option specifies the shared library (the lib and .so are added to square to get libsquare.so)

Now when you execute your program, you may receive the message

error while loading shared libraries, cannot open shared object file: No such file or directory.

This is because the linker cannot find the library. You can either use the environment variable LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/shared/object/file      --> This adds the path to the variable

Or you can put the path in /etc/ld.so.conf and run ldconfig.

I hope this is of assistance to you...

 

by: 1cePosted on 2003-08-27 at 13:30:40ID: 9235560

reck: neat info, can you talk abit about how to go about loading the .so in a program also? like the equivalent of LoadLibrary and GetProcAddress

 

by: grg99Posted on 2003-08-27 at 14:19:23ID: 9235894

Before you get all excited about .so files and the like, pls thing about the downside:

The user has to have the .so file
It has to be the correct version of the .so file.
It can't be just any xxx.so file with the same name, it has to be the matching one.
They have to set their search path to see the .so file.

Any common run-time (like C library) .so files have to match the version that your
code was compiled with, and they have to match the OS API version.
Sometimes you luck out and their system has the proper one. Sometimes not.


------

These arent insuperable roadblocks, but they *often* slow down your users,
atking an hour or two out of their day before they corral all the right .so files,
set the right paths, repeat this for all their logins.

At the very least, there will be a lot of cursing.

----

So you might want to distribute your program as one pre-linked binary.
I know, not very sophisticated, but at least the program has a chance of running
right off the bat, without a lot of .so file chasing.

 

by: shajithchandranPosted on 2003-08-27 at 22:12:27ID: 9237795

hi reck,
Really good info.

>>To use it you don't include the .h file
Why is .h not required. We use printf function for that we have to use stdio.h otherwise it will give undefined  symbol.
Is libc a static or dynamic lib?

What should be done so that we have to include square.h.
How to  u can add more fucntion to the same library.
that today i creat a library for square function.
Tommorrow i want to have squareroot also in the same library. How to do that.

hi grg99
>>It has to be the correct version of the .so file.
What is this version problem. Can u explain a little more on it. Can u tell me the internal of it. How is the version matched. Do the exe file has it. Who does the matching.

now when i run a.out which has links to some library function what happens . How is it get loaded. Can explain in steps in detail.

In short i want to know how a exe file is run. In and out about it.

 

by: shajithchandranPosted on 2003-08-27 at 22:17:20ID: 9237810

will ar -r will add new file to the existing lib?

 

by: shajithchandranPosted on 2003-08-27 at 22:26:53ID: 9237849

yes i able to add more fucntions to lib by using ar -r.
Now let me try dynamic lib.

 

by: shajithchandranPosted on 2003-08-27 at 22:46:16ID: 9237910

Yes even dynamic lib is working properly. Reck u r absolutly correct.
What abt .h problem. Why is stdio.h requried for printf while square.h is not required??
what is the difference b/w libc and our lib.

 

by: shajithchandranPosted on 2003-08-27 at 22:54:48ID: 9237938

Can u put some light on these things also
ldconfig ,dlopen and dlsym.

 

by: shajithchandranPosted on 2003-09-01 at 01:27:00ID: 9260310

No one to answer!!!

 

by: sunnycoderPosted on 2003-09-01 at 01:30:40ID: 9260327

      ldconfig creates the necessary links and cache (for use by the run-time linker, ld.so) to the most recent shared libraries found in the directo­ries specified on the command line, in the file /etc/ld.so.conf, and in the trusted directories (/usr/lib and /lib).  ldconfig checks the header and  file names of the libraries it encounters when determining which versions should have their links updated.  ldconfig ignores symbolic links when scanning for libraries.

for more info

man 8 ldconfig

man 3 dlopen

man 3 dlsym

 

by: reckPosted on 2003-09-01 at 02:45:46ID: 9260623

Sorry bout not replying, but I was working on a deadline...I must read some docs, cause I don't know of the top of my head why you include the .h file for stdio.h, but not for your own library...

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...