Subversion Repositories Kolibri OS

Rev

Rev 5191 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* Generic relocation support for BFD.
  2.    Copyright (C) 1998-2015 Free Software Foundation, Inc.
  3.  
  4.    This file is part of BFD, the Binary File Descriptor library.
  5.  
  6.    This program is free software; you can redistribute it and/or modify
  7.    it under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 3 of the License, or
  9.    (at your option) any later version.
  10.  
  11.    This program is distributed in the hope that it will be useful,
  12.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with this program; if not, write to the Free Software Foundation,
  18.    Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
  19.  
  20. /* These macros are used by the various *.h target specific header
  21.    files to either generate an enum containing all the known relocations
  22.    for that target, or if RELOC_MACROS_GEN_FUNC is defined, a recognition
  23.    function is generated instead.  (This is used by binutils/readelf.c)
  24.  
  25.    Given a header file like this:
  26.  
  27.         START_RELOC_NUMBERS (foo)
  28.             RELOC_NUMBER (R_foo_NONE,    0)
  29.             RELOC_NUMBER (R_foo_32,      1)
  30.             EMPTY_RELOC  (R_foo_good)
  31.             FAKE_RELOC   (R_foo_illegal, 9)
  32.         END_RELOC_NUMBERS (R_foo_count)
  33.  
  34.    Then the following will be produced by default (ie if
  35.    RELOC_MACROS_GEN_FUNC is *not* defined).
  36.  
  37.         enum foo
  38.         {
  39.           R_foo_NONE = 0,
  40.           R_foo_32 = 1,
  41.           R_foo_good,
  42.           R_foo_illegal = 9,
  43.           R_foo_count
  44.         };
  45.  
  46.    Note: The value of the symbol defined in the END_RELOC_NUMBERS
  47.    macro (R_foo_count in the case of the example above) will be
  48.    set to the value of the whichever *_RELOC macro precedes it plus
  49.    one.  Therefore if you intend to use the symbol as a sentinel for
  50.    the highest valid macro value you should make sure that the
  51.    preceding *_RELOC macro is the highest valid number.  ie a
  52.    declaration like this:
  53.  
  54.         START_RELOC_NUMBERS (foo)
  55.             RELOC_NUMBER (R_foo_NONE,    0)
  56.             RELOC_NUMBER (R_foo_32,      1)
  57.             FAKE_RELOC   (R_foo_illegal, 9)
  58.             FAKE_RELOC   (R_foo_synonym, 0)
  59.         END_RELOC_NUMBERS (R_foo_count)
  60.  
  61.    will result in R_foo_count having a value of 1 (R_foo_synonym + 1)
  62.    rather than 10 or 2 as might be expected.
  63.  
  64.    Alternatively you can assign a value to END_RELOC_NUMBERS symbol
  65.    explicitly, like this:
  66.  
  67.         START_RELOC_NUMBERS (foo)
  68.             RELOC_NUMBER (R_foo_NONE,    0)
  69.             RELOC_NUMBER (R_foo_32,      1)
  70.             FAKE_RELOC   (R_foo_illegal, 9)
  71.             FAKE_RELOC   (R_foo_synonym, 0)
  72.         END_RELOC_NUMBERS (R_foo_count = 2)
  73.  
  74.    If RELOC_MACROS_GEN_FUNC *is* defined, then instead the
  75.    following function will be generated:
  76.  
  77.         static const char *foo (unsigned long rtype);
  78.         static const char *
  79.         foo (unsigned long rtype)
  80.         {
  81.            switch (rtype)
  82.            {
  83.            case 0: return "R_foo_NONE";
  84.            case 1: return "R_foo_32";
  85.            default: return NULL;
  86.            }
  87.         }
  88.    */
  89.  
  90. #ifndef _RELOC_MACROS_H
  91. #define _RELOC_MACROS_H
  92.  
  93. #ifdef RELOC_MACROS_GEN_FUNC
  94.  
  95. /* This function takes the relocation number and returns the
  96.    string version name of the name of that relocation.  If
  97.    the relocation is not recognised, NULL is returned.  */
  98.  
  99. #define START_RELOC_NUMBERS(name)                               \
  100. static const char *name (unsigned long rtype);                  \
  101. static const char *                                             \
  102. name (unsigned long rtype)                                      \
  103. {                                                               \
  104.   switch (rtype)                                                \
  105.     {
  106.  
  107. #define RELOC_NUMBER(name, number) \
  108.     case number: return #name;
  109.  
  110. #define FAKE_RELOC(name, number)
  111. #define EMPTY_RELOC(name)
  112.  
  113. #define END_RELOC_NUMBERS(name) \
  114.     default: return NULL;       \
  115.     }                           \
  116. }
  117.  
  118.  
  119. #else /* Default to generating enum.  */
  120.  
  121. #define START_RELOC_NUMBERS(name)   enum name {
  122. #define RELOC_NUMBER(name, number)  name = number,
  123. #define FAKE_RELOC(name, number)    name = number,
  124. #define EMPTY_RELOC(name)           name,
  125. #define END_RELOC_NUMBERS(name)     name };
  126.  
  127. #endif
  128.  
  129. #endif /* _RELOC_MACROS_H */
  130.