Working with libraries: Difference between revisions
| (8 intermediate revisions by 2 users 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 [ | * 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=== | |||
* 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 36: | 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== | ||