[no subject]



- export as little as possible.  References to objects not exported are
  relative and don't require name lookup.

  As a consequence this means use callbacks whenever possible.  Instead
  of exporting a 10 functions export only one function which fills in a
  data structure with information about those 10 functions so that they
  can be called indirectly.  And before you say indirect calls suck
  remember that calls via the PLT etc are also relative.  So there is no
  penalty added.

- never export variables.  Always functions which return pointers to
  variables.

- made easy by the first point above: explicitly use dlopen() to load
  DSO.  This is lazy loading implemented correctly.  The application
  controls when another DSO is needed.  By using callbacks the amount
  of work needed to use the newly loaded DSO is minimal: just call the
  function to get the callbacks.  Note how easy it is to just fill in
  the callback structure with pointers to functions which load the DSO
  if necessary.

- don't load DSOs with RTLD_GLOBAL.  This is a performance killer since
  the global name space is extended.  Before any symbol is found in
  those newly loaded DSOs all other DSOs and the main application are
  searched.

- in a DSO, call functions which are exported but which you don't want
  to be interposed with an alias.  This is most probably a good idea
  in all situations but might introduce problems if this change is
  introduced after the DSO is already started being used.  Nevertheless,
  is justified.

  To see what can be done look at the .rel.plt/.rela.plt section in
  your DSO.  Ideally it should be empty/non-existing.

- while we are at it, look at the other relocations.  All relocations
  should be relative relocations unless you explicitly reference code
  somewhere else.

- don't rely on interposition, not explicitly in code nor using
  LD_PRELOAD.  This will kill a lot of the possible optimizations.  If
  you have to enhance an interface create a new one, don't overload
  the name.

- put functions as much as it makes sense in separate source files.
  Some code simply belongs together and a function of the group isn't
  called alone.  That's fine.  But if there are programs using one
  subset of the functions but none of the remaining functions the
  sources should reflect that.  Ideally tools should be available to
  figure this out but these tools must use heuristics and these will
  definitely fail on occasion.  Everything the programmer is
  implementing explicitly cannot be handled incorrectly by the tool.

- not to be mentioned, of course, is the fact that every DSO with text
  relocations must be changed.  Often this only requires correct
  recompilation but sometimes it's invalid code (mostly assembler)
  which needs to be rewritten.

-- 
---------------.                          ,-.   1325 Chesapeake Terrace
Ulrich Drepper  \    ,-------------------'   \  Sunnyvale, CA 94089 USA
Red Hat          `--' drepper at redhat.com   `------------------------




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]