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

Re: [Xen-devel] [PATCH] x86-64: reduce symbol table size



This doesn't build for me. Build host is Debian Etch running gcc 4.1.2 and
binutils 2.17. Error snippet is attached -- it complains like this for every
PTR line in .xen-syms.0.S.

 -- Keir

On 10/07/2009 15:26, "Jan Beulich" <JBeulich@xxxxxxxxxx> wrote:

> With all of Xen's symbols sitting within a 2Gb range on x86-64, they
> can be referred to by the kallsyms-like offset table using 4- instead
> of 8-byte slots.
> 
> The marker table can use 4-byte slots in all cases, just like the table
> entry counts can (though that's only a minor improvement).
> 
> If ia64's PERCPU_ADDR got moved down to (KERNEL_START + 2Gb -
> PERCPU_PAGE_SIZE), it could also utilize the more compact form.
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
> 
> --- 2009-06-10.orig/xen/common/symbols.c 2007-04-02 12:16:26.000000000 +0200
> +++ 2009-06-10/xen/common/symbols.c 2009-06-30 16:58:32.000000000 +0200
> @@ -18,21 +18,27 @@
>  #include <xen/string.h>
>  #include <xen/spinlock.h>
>  
> -extern unsigned long symbols_addresses[];
> -extern unsigned long symbols_num_syms;
> -extern u8 symbols_names[];
> +#ifdef SYMBOLS_ORIGIN
> +extern const unsigned int symbols_offsets[1];
> +#define symbols_address(n) (SYMBOLS_ORIGIN + symbols_offsets[n])
> +#else
> +extern const unsigned long symbols_addresses[];
> +#define symbols_address(n) symbols_addresses[n]
> +#endif
> +extern const unsigned int symbols_num_syms;
> +extern const u8 symbols_names[];
>  
> -extern u8 symbols_token_table[];
> -extern u16 symbols_token_index[];
> +extern const u8 symbols_token_table[];
> +extern const u16 symbols_token_index[];
>  
> -extern unsigned long symbols_markers[];
> +extern const unsigned int symbols_markers[];
>  
>  /* expand a compressed symbol data into the resulting uncompressed string,
>     given the offset to where the symbol is in the compressed stream */
>  static unsigned int symbols_expand_symbol(unsigned int off, char *result)
>  {
>      int len, skipped_first = 0;
> -    u8 *tptr, *data;
> +    const u8 *tptr, *data;
>  
>      /* get the compressed symbol length from the first symbol byte */
>      data = &symbols_names[off];
> @@ -70,7 +76,7 @@ static unsigned int symbols_expand_symbo
>   * symbols array */
>  static unsigned int get_symbol_offset(unsigned long pos)
>  {
> -    u8 *name;
> +    const u8 *name;
>      int i;
>  
>      /* use the closest marker we have. We have markers every 256 positions,
> @@ -107,13 +113,13 @@ const char *symbols_lookup(unsigned long
>  
>      while (high-low > 1) {
>          mid = (low + high) / 2;
> -        if (symbols_addresses[mid] <= addr) low = mid;
> +        if (symbols_address(mid) <= addr) low = mid;
>          else high = mid;
>      }
>  
>      /* search for the first aliased symbol. Aliased symbols are
>             symbols with the same address */
> -    while (low && symbols_addresses[low - 1] == symbols_addresses[low])
> +    while (low && symbols_address(low - 1) == symbols_address(low))
>          --low;
>  
>          /* Grab name */
> @@ -121,8 +127,8 @@ const char *symbols_lookup(unsigned long
>  
>      /* Search for next non-aliased symbol */
>      for (i = low + 1; i < symbols_num_syms; i++) {
> -        if (symbols_addresses[i] > symbols_addresses[low]) {
> -            symbol_end = symbols_addresses[i];
> +        if (symbols_address(i) > symbols_address(low)) {
> +            symbol_end = symbols_address(i);
>              break;
>          }
>      }
> @@ -132,8 +138,8 @@ const char *symbols_lookup(unsigned long
>          symbol_end = is_kernel_inittext(addr) ?
>              (unsigned long)_einittext : (unsigned long)_etext;
>  
> -    *symbolsize = symbol_end - symbols_addresses[low];
> -    *offset = addr - symbols_addresses[low];
> +    *symbolsize = symbol_end - symbols_address(low);
> +    *offset = addr - symbols_address(low);
>      return namebuf;
>  }
>  
> --- 2009-06-10.orig/xen/common/symbols-dummy.c 2006-10-04 08:49:30.000000000
> +0200
> +++ 2009-06-10/xen/common/symbols-dummy.c 2009-06-30 16:55:43.000000000 +0200
> @@ -6,11 +6,15 @@
>  #include <xen/config.h>
>  #include <xen/types.h>
>  
> -unsigned long symbols_addresses[1];
> -unsigned long symbols_num_syms;
> -u8 symbols_names[1];
> +#ifdef SYMBOLS_ORIGIN
> +const unsigned int symbols_offsets[1];
> +#else
> +const unsigned long symbols_addresses[1];
> +#endif
> +const unsigned int symbols_num_syms;
> +const u8 symbols_names[1];
>  
> -u8 symbols_token_table[1];
> -u16 symbols_token_index[1];
> +const u8 symbols_token_table[1];
> +const u16 symbols_token_index[1];
>  
> -unsigned long symbols_markers[1];
> +const unsigned int symbols_markers[1];
> --- 2009-06-10.orig/xen/include/asm-x86/config.h 2009-06-10 15:09:22.000000000
> +0200
> +++ 2009-06-10/xen/include/asm-x86/config.h 2009-06-30 16:52:22.000000000
> +0200
> @@ -259,6 +259,8 @@ extern unsigned int video_mode, video_fl
>  #define __HYPERVISOR_DS32 0xe010
>  #define __HYPERVISOR_DS   __HYPERVISOR_DS64
>  
> +#define SYMBOLS_ORIGIN XEN_VIRT_START
> +
>  /* For generic assembly code: use macros to define operation/operand sizes.
> */
>  #define __OS          "q"  /* Operation Suffix */
>  #define __OP          "r"  /* Operand Prefix */
> --- 2009-06-10.orig/xen/tools/symbols.c 2008-12-03 10:55:25.000000000 +0100
> +++ 2009-06-10/xen/tools/symbols.c 2009-07-01 09:53:36.000000000 +0200
> @@ -108,10 +108,7 @@ static int read_symbol(FILE *in, struct
> else if (toupper((uint8_t)stype) == 'A')
> {
> /* Keep these useful absolute symbols */
> -  if (strcmp(sym, "__kernel_syscall_via_break") &&
> -      strcmp(sym, "__kernel_syscall_via_epc") &&
> -      strcmp(sym, "__kernel_sigtramp") &&
> -      strcmp(sym, "__gp"))
> +  if (strcmp(sym, "__gp"))
> return -1;
>  
> }
> @@ -135,18 +132,9 @@ static int read_symbol(FILE *in, struct
>  static int symbol_valid(struct sym_entry *s)
>  {
> /* Symbols which vary between passes.  Passes 1 and 2 must have
> -  * identical symbol lists.  The symbols_* symbols below are only added
> -  * after pass 1, they would be included in pass 2 when --all-symbols is
> -  * specified so exclude them to get a stable symbol list.
> +  * identical symbol lists.
> */
> static char *special_symbols[] = {
> -  "symbols_addresses",
> -  "symbols_num_syms",
> -  "symbols_names",
> -  "symbols_markers",
> -  "symbols_token_table",
> -  "symbols_token_index",
> -
> /* Exclude linker generated symbols which vary between passes */
> "_SDA_BASE_",  /* ppc */
> "_SDA2_BASE_",  /* ppc */
> @@ -251,8 +239,9 @@ static void write_src(void)
> unsigned int *markers;
> char buf[KSYM_NAME_LEN+1];
>  
> + printf("#include <xen/config.h>\n");
> printf("#include <asm/types.h>\n");
> - printf("#if BITS_PER_LONG == 64\n");
> + printf("#if BITS_PER_LONG == 64 && !defined(SYMBOLS_ORIGIN)\n");
> printf("#define PTR .quad\n");
> printf("#define ALGN .align 8\n");
> printf("#else\n");
> @@ -260,16 +249,21 @@ static void write_src(void)
> printf("#define ALGN .align 4\n");
> printf("#endif\n");
>  
> - printf(".data\n");
> + printf("\t.section .rodata, \"a\"\n");
>  
> + printf("#ifndef SYMBOLS_ORIGIN\n");
> + printf("#define SYMBOLS_ORIGIN 0\n");
> output_label("symbols_addresses");
> + printf("#else\n");
> + output_label("symbols_offsets");
> + printf("#endif\n");
> for (i = 0; i < table_cnt; i++) {
> -  printf("\tPTR\t%#llx\n", table[i].addr);
> +  printf("\tPTR\t%#llx - SYMBOLS_ORIGIN\n", table[i].addr);
> }
> printf("\n");
>  
> output_label("symbols_num_syms");
> - printf("\tPTR\t%d\n", table_cnt);
> + printf("\t.long\t%d\n", table_cnt);
> printf("\n");
>  
> /* table of offset markers, that give the offset in the compressed stream
> @@ -293,7 +287,7 @@ static void write_src(void)
>  
> output_label("symbols_markers");
> for (i = 0; i < ((table_cnt + 255) >> 8); i++)
> -  printf("\tPTR\t%d\n", markers[i]);
> +  printf("\t.long\t%d\n", markers[i]);
> printf("\n");
>  
> free(markers);
> 
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel

Attachment: error.txt
Description: Binary data

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.