public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* kallsyms __print_symbol prints first weak symbol encountered
@ 2007-10-30 17:49 Mathieu Desnoyers
  2007-10-30 19:49 ` Paulo Marques
  2007-10-30 23:38 ` Rusty Russell
  0 siblings, 2 replies; 4+ messages in thread
From: Mathieu Desnoyers @ 2007-10-30 17:49 UTC (permalink / raw)
  To: Rusty Russell; +Cc: linux-kernel, systemtap@sourceware.org

Hi,

I am try to see how I can use kallsyms to get the mapping syscall id ->
syscall name by listing all the symbols corresponding to the function
pointers present in the sys_call_table.

However, I just ran into what I consider an unusual behavior of kallsyms:
when I list the sys_ni() (not implemented system calls), I get
compat_sys_futex instead.

If I look at System.map, it's explained by this:

c0146630 W compat_sys_futex
c0146630 W compat_sys_get_mempolicy
c0146630 W compat_sys_get_robust_list
c0146630 W compat_sys_ipc
c0146630 W compat_sys_kexec_load
c0146630 W compat_sys_keyctl
...
c0146630 T sys_ni_syscall
...
c0146630 W sys_timerfd

kallsyms returns the first symbol encountered, even though it is weak,
when it should in fact return sys_ni_syscall.

Is it a concern for anyone else out there ? Would it make sense to fix
it ?

Mathieu

-- 
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: kallsyms __print_symbol prints first weak symbol encountered
  2007-10-30 17:49 kallsyms __print_symbol prints first weak symbol encountered Mathieu Desnoyers
@ 2007-10-30 19:49 ` Paulo Marques
  2007-10-30 23:45   ` Mathieu Desnoyers
  2007-10-30 23:38 ` Rusty Russell
  1 sibling, 1 reply; 4+ messages in thread
From: Paulo Marques @ 2007-10-30 19:49 UTC (permalink / raw)
  To: Mathieu Desnoyers; +Cc: Rusty Russell, linux-kernel, systemtap@sourceware.org

[-- Attachment #1: Type: text/plain, Size: 1058 bytes --]

Mathieu Desnoyers wrote:
> Hi,

Hi,

> [...]
> kallsyms returns the first symbol encountered, even though it is weak,
> when it should in fact return sys_ni_syscall.
> 
> Is it a concern for anyone else out there ? Would it make sense to fix
> it ?

I don't know if it is a concern, but if we're going to fix it, we should
probably do it in "scripts/kallsyms" by providing a list that is already
sorted according to "address, weakness".

This way the run-time kernel keeps the current behavior, without any 
overhead. Something along the lines of the attached patch (just compile 
tested).

However, this is an area where we've had problems in the past with some 
architectures giving different results between passes, and then any 
change to the symbol order might make the problem worse and make the 
build process fail with a "Inconsistent kallsyms data" error message.

So, if someone wants to use this, it should go through -mm for a while, 
first.

-- 
Paulo Marques - www.grupopie.com

"All I ask is a chance to prove that money can't make me happy."

[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 1467 bytes --]

--- ./scripts/kallsyms.c.orig	2007-10-30 18:51:28.000000000 +0000
+++ ./scripts/kallsyms.c	2007-10-30 19:07:58.000000000 +0000
@@ -34,7 +34,7 @@
 
 struct sym_entry {
 	unsigned long long addr;
-	unsigned int len;
+	unsigned int len, start_pos;
 	unsigned char *sym;
 };
 
@@ -202,8 +202,10 @@ static void read_map(FILE *in)
 				exit (1);
 			}
 		}
-		if (read_symbol(in, &table[table_cnt]) == 0)
+		if (read_symbol(in, &table[table_cnt]) == 0) {
+			table[table_cnt].start_pos = table_cnt;
 			table_cnt++;
+		}
 	}
 }
 
@@ -507,6 +509,35 @@ static void optimize_token_table(void)
 }
 
 
+static int compare_symbols(const void *a, const void *b)
+{
+	struct sym_entry *sa, *sb;
+	int wa, wb;
+
+	sa = (struct sym_entry *) a;
+	sb = (struct sym_entry *) b;
+
+	// sort by address first
+	if (sa->addr > sb->addr)
+		return 1;
+	if (sa->addr < sb->addr)
+		return -1;
+
+	// sort by "weakness" type
+	wa = (sa->sym[0] == 'w') || (sa->sym[0] == 'W');
+	wb = (sb->sym[0] == 'w') || (sb->sym[0] == 'W');
+	if (wa != wb)
+		return wa - wb;
+
+	// sort by initial order, so that other symbols are left undisturbed
+	return sa->start_pos - sb->start_pos;
+}
+
+static void sort_symbols(void)
+{
+	qsort(table, table_cnt, sizeof(struct sym_entry), compare_symbols);
+}
+
 int main(int argc, char **argv)
 {
 	if (argc >= 2) {
@@ -527,6 +558,7 @@ int main(int argc, char **argv)
 		usage();
 
 	read_map(stdin);
+	sort_symbols();
 	optimize_token_table();
 	write_src();
 


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: kallsyms __print_symbol prints first weak symbol encountered
  2007-10-30 17:49 kallsyms __print_symbol prints first weak symbol encountered Mathieu Desnoyers
  2007-10-30 19:49 ` Paulo Marques
@ 2007-10-30 23:38 ` Rusty Russell
  1 sibling, 0 replies; 4+ messages in thread
From: Rusty Russell @ 2007-10-30 23:38 UTC (permalink / raw)
  To: Mathieu Desnoyers; +Cc: linux-kernel, systemtap@sourceware.org

On Wednesday 31 October 2007 04:49:02 Mathieu Desnoyers wrote:
> kallsyms returns the first symbol encountered, even though it is weak,
> when it should in fact return sys_ni_syscall.

Yes, it's an arbitrary choice, but preferring non-weak symbols would 
definitely be a win.

Thanks!
Rusty.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: kallsyms __print_symbol prints first weak symbol encountered
  2007-10-30 19:49 ` Paulo Marques
@ 2007-10-30 23:45   ` Mathieu Desnoyers
  0 siblings, 0 replies; 4+ messages in thread
From: Mathieu Desnoyers @ 2007-10-30 23:45 UTC (permalink / raw)
  To: Paulo Marques; +Cc: Rusty Russell, linux-kernel, systemtap@sourceware.org

* Paulo Marques (pmarques@grupopie.com) wrote:
> Mathieu Desnoyers wrote:
> >Hi,
> 
> Hi,
> 
> >[...]
> >kallsyms returns the first symbol encountered, even though it is weak,
> >when it should in fact return sys_ni_syscall.
> >
> >Is it a concern for anyone else out there ? Would it make sense to fix
> >it ?
> 
> I don't know if it is a concern, but if we're going to fix it, we should
> probably do it in "scripts/kallsyms" by providing a list that is already
> sorted according to "address, weakness".
> 
> This way the run-time kernel keeps the current behavior, without any 
> overhead. Something along the lines of the attached patch (just compile 
> tested).
> 
> However, this is an area where we've had problems in the past with some 
> architectures giving different results between passes, and then any 
> change to the symbol order might make the problem worse and make the 
> build process fail with a "Inconsistent kallsyms data" error message.
> 
> So, if someone wants to use this, it should go through -mm for a while, 
> first.
> 

Runtime test is ok. It fixes the problem. Thanks!

Mathieu

> -- 
> Paulo Marques - www.grupopie.com
> 
> "All I ask is a chance to prove that money can't make me happy."

> --- ./scripts/kallsyms.c.orig	2007-10-30 18:51:28.000000000 +0000
> +++ ./scripts/kallsyms.c	2007-10-30 19:07:58.000000000 +0000
> @@ -34,7 +34,7 @@
>  
>  struct sym_entry {
>  	unsigned long long addr;
> -	unsigned int len;
> +	unsigned int len, start_pos;
>  	unsigned char *sym;
>  };
>  
> @@ -202,8 +202,10 @@ static void read_map(FILE *in)
>  				exit (1);
>  			}
>  		}
> -		if (read_symbol(in, &table[table_cnt]) == 0)
> +		if (read_symbol(in, &table[table_cnt]) == 0) {
> +			table[table_cnt].start_pos = table_cnt;
>  			table_cnt++;
> +		}
>  	}
>  }
>  
> @@ -507,6 +509,35 @@ static void optimize_token_table(void)
>  }
>  
>  
> +static int compare_symbols(const void *a, const void *b)
> +{
> +	struct sym_entry *sa, *sb;
> +	int wa, wb;
> +
> +	sa = (struct sym_entry *) a;
> +	sb = (struct sym_entry *) b;
> +
> +	// sort by address first
> +	if (sa->addr > sb->addr)
> +		return 1;
> +	if (sa->addr < sb->addr)
> +		return -1;
> +
> +	// sort by "weakness" type
> +	wa = (sa->sym[0] == 'w') || (sa->sym[0] == 'W');
> +	wb = (sb->sym[0] == 'w') || (sb->sym[0] == 'W');
> +	if (wa != wb)
> +		return wa - wb;
> +
> +	// sort by initial order, so that other symbols are left undisturbed
> +	return sa->start_pos - sb->start_pos;
> +}
> +
> +static void sort_symbols(void)
> +{
> +	qsort(table, table_cnt, sizeof(struct sym_entry), compare_symbols);
> +}
> +
>  int main(int argc, char **argv)
>  {
>  	if (argc >= 2) {
> @@ -527,6 +558,7 @@ int main(int argc, char **argv)
>  		usage();
>  
>  	read_map(stdin);
> +	sort_symbols();
>  	optimize_token_table();
>  	write_src();
>  
> 


-- 
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2007-10-30 23:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-30 17:49 kallsyms __print_symbol prints first weak symbol encountered Mathieu Desnoyers
2007-10-30 19:49 ` Paulo Marques
2007-10-30 23:45   ` Mathieu Desnoyers
2007-10-30 23:38 ` Rusty Russell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox