Home | History | Annotate | Download | only in src
      1 /* Section hash table implementation.
      2    Copyright (C) 2001, 2002, 2005 Red Hat, Inc.
      3    This file is part of elfutils.
      4    Written by Ulrich Drepper <drepper (at) redhat.com>, 2001.
      5 
      6    This file 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    elfutils is distributed in the hope that it will be useful, but
     12    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, see <http://www.gnu.org/licenses/>.  */
     18 
     19 #ifdef HAVE_CONFIG_H
     20 # include <config.h>
     21 #endif
     22 
     23 #include <string.h>
     24 
     25 #include <elf-knowledge.h>
     26 #include <ld.h>
     27 
     28 
     29 /* Comparison function for sections.  */
     30 static int
     31 scnhead_compare (struct scnhead *one, struct scnhead *two)
     32 {
     33   int result = strcmp (one->name, two->name);
     34 
     35   if (result == 0)
     36     {
     37       result = one->type - two->type;
     38 
     39       if (result == 0)
     40 	{
     41 	  GElf_Sxword diff = (SH_FLAGS_IMPORTANT (one->flags)
     42 			     - SH_FLAGS_IMPORTANT (two->flags));
     43 	  result = diff < 0 ? -1 : diff == 0 ? 0 : 1;
     44 
     45 	  if (result == 0)
     46 	    {
     47 	      result = one->entsize - two->entsize;
     48 
     49 	      if (result == 0)
     50 		{
     51 		  result = (one->grp_signature == NULL
     52 			    ? (two->grp_signature == NULL ? 0 : -1)
     53 			    : (two->grp_signature == NULL
     54 			       ? 1 : strcmp (one->grp_signature,
     55 					     two->grp_signature)));
     56 
     57 		  if (result == 0)
     58 		    result = one->kind - two->kind;
     59 		}
     60 	    }
     61 	}
     62     }
     63 
     64   return result;
     65 }
     66 
     67 /* Definitions for the section hash table.  */
     68 #define TYPE struct scnhead *
     69 #define NAME ld_section_tab
     70 #define ITERATE 1
     71 #define COMPARE(a, b) scnhead_compare (a, b)
     72 
     73 #include "../lib/dynamicsizehash.c"
     74