Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does the GNU ld --undefined option do?

Tags:

c

gcc

gnu

linker

ld

Can somebody explain what the GNU ld option --undefined does?

Working on a LiteOS project. The app is linked with many -u options. For example -utask_shellcmd.

The GNU linker manual for --undefined=symbol simply says:

Force symbol to be entered in the output file as an undefined symbol. Doing this may, for example, trigger linking of additional modules from standard libraries.

So the symbol will be included in the output file as an undefined. What if the symbol is already defined in one of the linked obj files? If it is really undefined, when the linking of additional modules will happen and how does that happen?

like image 499
minghua Avatar asked Mar 03 '17 21:03

minghua


People also ask

What is the LD command used for?

Description. The ld command, also called the linkage editor or binder, combines object files, archives, and import files into one output object file, resolving external references. It produces an executable object file that can be run.

What is LD option?

ld normally optimizes for speed over memory usage by caching the symbol tables of input files in memory. This option tells ld to instead optimize for memory usage, by rereading the symbol tables as necessary. This may be required if ld runs out of memory space while linking a large executable.

WHAT ARE LD files?

An LD file is a script written in the GNU "linker command language." It contains one or more commands that are used to configure how input files storing static object code are to be compiled into a single executable program or library for the GNU operating system.

What does linker option do?

Linker options control linking operations. They can be placed on the command line or in a command file. Linker options must be preceded by a hyphen (-). Options can be separated from arguments (if they have them) by an optional space.


Video Answer


1 Answers

The -u option is only relevant when archive (.a) libraries are involved (maybe also .so libraries with --as-needed in effect).

Unlike individual object files (.o) on the linking command line, which are all linked in the order in which they appear, object files from an archive library are only linked when they satisfy one or more undefined symbol references at the point they appear in the link command line order. Once once .o file from the archive is pulled into the link, the process is repeated recursively, so that if it introduces more undefined symbol references, other object files from the same (or later) archives will be pulled in to satisfy them.

Using -u allows you to cause a particular symbol (and, indirectly, all dependencies of the object file it was defined in) to be pulled into the link. Of course you could just put all .o files on the command line directly, without using any archive libraries, but by using libraries you can avoid linking unused object files (this is especially useful if large parts of the code may be unused depending on build-time-configurable settings in other files!) while getting the ones you need.

like image 132
R.. GitHub STOP HELPING ICE Avatar answered Oct 26 '22 06:10

R.. GitHub STOP HELPING ICE