Working with libraries

From dankwiki
Revision as of 07:27, 3 May 2009 by Dank (talk | contribs)

Building libraries

gcc issues

  • For predictable results, the same set of options used to generate code (see "Code Gen Options" and "Submodel Options" in the gcc Info pages) must be used to link (see "Link Options" in the gcc Info pages)!
  • -shared should be supplied with the link step to produce a shared object.
  • Regarding -fpic vs -fPIC: -fPIC is only necessary in certain architecture-dependent situations; gcc will let you know if it's needed, and fail out, should you provide -fpic
  • Use -Wl,ldopt to pass options to ld (see below)

ld issues

  • Generally, either the packaging system or build process needs invoke ldconfig with suitable arguments so that the linker cache is updated.
  • The -t option (-Wl,-t as a gcc option) traces input files to ld, and can be useful for debugging, as can -y symbol to trace a given symbol's introduction and use.m
  • soname=name sets the internal DT_SONAME field of an ELF object
  • -fini name and -init name to specify alternative values for the ELF DT_INIT and DT_FINI initialization and finalization fields. By default, _init and _finit are used.
  • -rpath=path (-R directory on some linkers; GNU ld supports this) sets the DT_RUNPATH (DT_RPATH without new dtags) dtag, controlling rpaths
    • --enable-new-dtags is required to generate DT_RUNPATH or DT_FLAGS dtags specified by newer ELF systems.

Building with libraries

  • If the library supports pkg-config, and you're willing to depend on that tool being installed, proper compilation flags can be lifted from it:
    • pkg-config --cflags pkgname will pull the preprocessor and compilation flags
    • pkg-config --libs pkgname will pull the linking flags
    • pkg-config --list-all lists all libraries registered with pkg-config

Runtime linking

Environment variables that control

Files that control


What the hell is

The SYSENTER/SYSEXIT instructions of some Pentium processors provides a faster way to switch rings (a callgate, hence the name). This page explains pretty well what's going on.

Quality Assurance

  • Use ldd's command line options to check the library.
    • Discover unused direct dependencies with -u -r:
[recombinator](1) $ ldd -u -r /usr/lib/
Unused direct dependencies:
[recombinator](1) $ ldd -u -r .out/libdank/
Unused direct dependencies:
[recombinator](1) $
  • ld warn options, especially --warn-shared-textrel, --fatal-warnings, --warn-common, etc

See also