Working with libraries: Difference between revisions

No edit summary
 
(6 intermediate revisions by the same user not shown)
Line 12: Line 12:
* <tt>-rpath=''path''</tt> (<tt>-R ''directory''</tt> on some linkers; GNU ld supports this) sets the DT_RUNPATH (DT_RPATH without new dtags) dtag, controlling [[rpaths]]
* <tt>-rpath=''path''</tt> (<tt>-R ''directory''</tt> on some linkers; GNU ld supports this) sets the DT_RUNPATH (DT_RPATH without new dtags) dtag, controlling [[rpaths]]
** <tt>--enable-new-dtags</tt> is required to generate DT_RUNPATH or DT_FLAGS dtags specified by newer [[ELF]] systems.
** <tt>--enable-new-dtags</tt> is required to generate DT_RUNPATH or DT_FLAGS dtags specified by newer [[ELF]] systems.
* Set an [[ELF]] entry point via -Wl,-e,<tt>your exported symbol</tt>
** This is how [[glibc|libc6.so]] prints diagnostic information when executed


==Building with libraries==
==Building with libraries==
* If the library supports [http://pkg-config.freedesktop.org pkg-config], and you're willing to depend on that tool being installed, proper compilation flags can be lifted from it:
* 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:
** <tt>pkg-config --cflags ''pkgname''</tt> will pull the preprocessor and compilation flags
** <tt>pkg-config --cflags ''pkgname''</tt> will pull the preprocessor and compilation flags
** <tt>pkg-config --libs ''pkgname''</tt> will pull the linking flags
** <tt>pkg-config --libs ''pkgname''</tt> will pull the linking flags
Line 22: Line 24:
===Environment variables that control ld.so===
===Environment variables that control ld.so===
===Files that control ld.so===
===Files that control ld.so===
* The presence of <tt>/etc/ld.so.nohwcap</tt> precludes use of optimized library versions
===Interpositioning===
===Interpositioning===
* Using the GNU linker, a particular object can wrap a symbol via <tt>-Wl,--wrap,symbolname</tt>. This will result in calls to <tt>symbolname</tt> resolving to <tt>__wrap_symbolname</tt>, and calls to <tt>__real_symbolname</tt> to resolve <tt>symbolname</tt>.
* LD_PRELOAD can force an object to be loaded early in dynamic linking. Export a symbol with the same identifier as the function to be wrapped, and use <tt>dlsym(RTLD_NEXT,symbolname)</tt> to access the wrapped symbol.
** Doing this with no per-call checking, in a thread-safe manner, is left as an exercise for the reader '''FIXME'''
===What the hell is linux-gate.so.1?===
The [[MSR|SYSENTER/SYSEXIT]] instructions of some Pentium processors provides a faster way to switch rings (a callgate, hence the name). [http://www.trilithium.com/johan/2005/08/linux-gate/ This page] explains pretty well what's going on.


==Quality Assurance==
==Quality Assurance==
Line 37: Line 47:
[recombinator](1) $</pre>
[recombinator](1) $</pre>
* ld warn options, especially <tt>--warn-shared-textrel</tt>, <tt>--fatal-warnings</tt>, <tt>--warn-common</tt>, etc
* ld warn options, especially <tt>--warn-shared-textrel</tt>, <tt>--fatal-warnings</tt>, <tt>--warn-common</tt>, etc
* Your libraries oughtn't be installed executable unless they can be meaningfully executed.
** An [[ELF]] object without an entry point, when executed, will coredump
** Either don't set executable bits, or run each installed library and ensure it exits cleanly


==See also==
==See also==