diff mbox

[1/2] Fix a build warning in scripts/sortextable.h

Message ID 1370745235-12951-1-git-send-email-dt.tangr@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Daniel Tang June 9, 2013, 2:33 a.m. UTC
The pointer passed to the _r() macro does not always match the type
of the function that it is aliasing and raises several of the following
warnings at compile time:

warning: passing argument 1 of ‘r8’ from incompatible pointer type

Fixed by casting the pointers to (void *) so they work with both the
32bit and 64bit code.

Signed-off-by: Daniel Tang <dt.tangr@gmail.com>
---
 scripts/sortextable.h | 29 +++++++++++++++--------------
 1 file changed, 15 insertions(+), 14 deletions(-)

Comments

Michal Marek July 3, 2013, 12:06 p.m. UTC | #1
Added David Daney to CC.

On 9.6.2013 04:33, Daniel Tang wrote:
> The pointer passed to the _r() macro does not always match the type
> of the function that it is aliasing and raises several of the following
> warnings at compile time:
> 
> warning: passing argument 1 of ‘r8’ from incompatible pointer type

In what environment (arch, compiler, glibc) are you seeing this?

Michal

> Fixed by casting the pointers to (void *) so they work with both the
> 32bit and 64bit code.
> 
> Signed-off-by: Daniel Tang <dt.tangr@gmail.com>
> ---
>  scripts/sortextable.h | 29 +++++++++++++++--------------
>  1 file changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/scripts/sortextable.h b/scripts/sortextable.h
> index f5eb43d..0a38fbd 100644
> --- a/scripts/sortextable.h
> +++ b/scripts/sortextable.h
> @@ -110,9 +110,9 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
>  	int i;
>  	int idx;
>  
> -	shdr = (Elf_Shdr *)((char *)ehdr + _r(&ehdr->e_shoff));
> +	shdr = (Elf_Shdr *)((char *)ehdr + _r((void *)&ehdr->e_shoff));
>  	shstrtab_sec = shdr + r2(&ehdr->e_shstrndx);
> -	secstrtab = (const char *)ehdr + _r(&shstrtab_sec->sh_offset);
> +	secstrtab = (const char *)ehdr + _r((void *)&shstrtab_sec->sh_offset);
>  	for (i = 0; i < r2(&ehdr->e_shnum); i++) {
>  		idx = r(&shdr[i].sh_name);
>  		if (strcmp(secstrtab + idx, "__ex_table") == 0) {
> @@ -122,8 +122,8 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
>  		if ((r(&shdr[i].sh_type) == SHT_REL ||
>  		     r(&shdr[i].sh_type) == SHT_RELA) &&
>  		    r(&shdr[i].sh_info) == extab_index) {
> -			relocs = (void *)ehdr + _r(&shdr[i].sh_offset);
> -			relocs_size = _r(&shdr[i].sh_size);
> +			relocs = (void *)ehdr + _r((void *)&shdr[i].sh_offset);
> +			relocs_size = _r((void *)&shdr[i].sh_size);
>  		}
>  		if (strcmp(secstrtab + idx, ".symtab") == 0)
>  			symtab_sec = shdr + i;
> @@ -142,14 +142,14 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
>  		fprintf(stderr,	"no __ex_table in  file: %s\n", fname);
>  		fail_file();
>  	}
> -	strtab = (const char *)ehdr + _r(&strtab_sec->sh_offset);
> +	strtab = (const char *)ehdr + _r((void *)&strtab_sec->sh_offset);
>  
> -	extab_image = (void *)ehdr + _r(&extab_sec->sh_offset);
> +	extab_image = (void *)ehdr + _r((void *)&extab_sec->sh_offset);
>  
>  	if (custom_sort) {
> -		custom_sort(extab_image, _r(&extab_sec->sh_size));
> +		custom_sort(extab_image, _r((void *)&extab_sec->sh_size));
>  	} else {
> -		int num_entries = _r(&extab_sec->sh_size) / extable_ent_size;
> +		int num_entries = _r((void *)&extab_sec->sh_size) / extable_ent_size;
>  		qsort(extab_image, num_entries,
>  		      extable_ent_size, compare_extable);
>  	}
> @@ -159,12 +159,13 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
>  
>  	/* find main_extable_sort_needed */
>  	sort_needed_sym = NULL;
> -	for (i = 0; i < _r(&symtab_sec->sh_size) / sizeof(Elf_Sym); i++) {
> -		sym = (void *)ehdr + _r(&symtab_sec->sh_offset);
> +	for (i = 0; i < _r((void *)&symtab_sec->sh_size) / sizeof(Elf_Sym); i++)
> +	{
> +		sym = (void *)ehdr + _r((void *)&symtab_sec->sh_offset);
>  		sym += i;
>  		if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)
>  			continue;
> -		idx = r(&sym->st_name);
> +		idx = r((void *)&sym->st_name);
>  		if (strcmp(strtab + idx, "main_extable_sort_needed") == 0) {
>  			sort_needed_sym = sym;
>  			break;
> @@ -178,9 +179,9 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
>  	}
>  	sort_needed_sec = &shdr[r2(&sort_needed_sym->st_shndx)];
>  	sort_done_location = (void *)ehdr +
> -		_r(&sort_needed_sec->sh_offset) +
> -		_r(&sort_needed_sym->st_value) -
> -		_r(&sort_needed_sec->sh_addr);
> +		_r((void *)&sort_needed_sec->sh_offset) +
> +		_r((void *)&sort_needed_sym->st_value) -
> +		_r((void *)&sort_needed_sec->sh_addr);
>  
>  #if 0
>  	printf("sort done marker at %lx\n",
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Michal Marek July 3, 2013, 12:07 p.m. UTC | #2
On 3.7.2013 14:06, Michal Marek wrote:
> Added David Daney to CC.

Second attempt, sorry.


> On 9.6.2013 04:33, Daniel Tang wrote:
>> The pointer passed to the _r() macro does not always match the type
>> of the function that it is aliasing and raises several of the following
>> warnings at compile time:
>>
>> warning: passing argument 1 of ‘r8’ from incompatible pointer type
> 
> In what environment (arch, compiler, glibc) are you seeing this?
> 
> Michal
> 
>> Fixed by casting the pointers to (void *) so they work with both the
>> 32bit and 64bit code.
>>
>> Signed-off-by: Daniel Tang <dt.tangr@gmail.com>
>> ---
>>  scripts/sortextable.h | 29 +++++++++++++++--------------
>>  1 file changed, 15 insertions(+), 14 deletions(-)
>>
>> diff --git a/scripts/sortextable.h b/scripts/sortextable.h
>> index f5eb43d..0a38fbd 100644
>> --- a/scripts/sortextable.h
>> +++ b/scripts/sortextable.h
>> @@ -110,9 +110,9 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
>>  	int i;
>>  	int idx;
>>  
>> -	shdr = (Elf_Shdr *)((char *)ehdr + _r(&ehdr->e_shoff));
>> +	shdr = (Elf_Shdr *)((char *)ehdr + _r((void *)&ehdr->e_shoff));
>>  	shstrtab_sec = shdr + r2(&ehdr->e_shstrndx);
>> -	secstrtab = (const char *)ehdr + _r(&shstrtab_sec->sh_offset);
>> +	secstrtab = (const char *)ehdr + _r((void *)&shstrtab_sec->sh_offset);
>>  	for (i = 0; i < r2(&ehdr->e_shnum); i++) {
>>  		idx = r(&shdr[i].sh_name);
>>  		if (strcmp(secstrtab + idx, "__ex_table") == 0) {
>> @@ -122,8 +122,8 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
>>  		if ((r(&shdr[i].sh_type) == SHT_REL ||
>>  		     r(&shdr[i].sh_type) == SHT_RELA) &&
>>  		    r(&shdr[i].sh_info) == extab_index) {
>> -			relocs = (void *)ehdr + _r(&shdr[i].sh_offset);
>> -			relocs_size = _r(&shdr[i].sh_size);
>> +			relocs = (void *)ehdr + _r((void *)&shdr[i].sh_offset);
>> +			relocs_size = _r((void *)&shdr[i].sh_size);
>>  		}
>>  		if (strcmp(secstrtab + idx, ".symtab") == 0)
>>  			symtab_sec = shdr + i;
>> @@ -142,14 +142,14 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
>>  		fprintf(stderr,	"no __ex_table in  file: %s\n", fname);
>>  		fail_file();
>>  	}
>> -	strtab = (const char *)ehdr + _r(&strtab_sec->sh_offset);
>> +	strtab = (const char *)ehdr + _r((void *)&strtab_sec->sh_offset);
>>  
>> -	extab_image = (void *)ehdr + _r(&extab_sec->sh_offset);
>> +	extab_image = (void *)ehdr + _r((void *)&extab_sec->sh_offset);
>>  
>>  	if (custom_sort) {
>> -		custom_sort(extab_image, _r(&extab_sec->sh_size));
>> +		custom_sort(extab_image, _r((void *)&extab_sec->sh_size));
>>  	} else {
>> -		int num_entries = _r(&extab_sec->sh_size) / extable_ent_size;
>> +		int num_entries = _r((void *)&extab_sec->sh_size) / extable_ent_size;
>>  		qsort(extab_image, num_entries,
>>  		      extable_ent_size, compare_extable);
>>  	}
>> @@ -159,12 +159,13 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
>>  
>>  	/* find main_extable_sort_needed */
>>  	sort_needed_sym = NULL;
>> -	for (i = 0; i < _r(&symtab_sec->sh_size) / sizeof(Elf_Sym); i++) {
>> -		sym = (void *)ehdr + _r(&symtab_sec->sh_offset);
>> +	for (i = 0; i < _r((void *)&symtab_sec->sh_size) / sizeof(Elf_Sym); i++)
>> +	{
>> +		sym = (void *)ehdr + _r((void *)&symtab_sec->sh_offset);
>>  		sym += i;
>>  		if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)
>>  			continue;
>> -		idx = r(&sym->st_name);
>> +		idx = r((void *)&sym->st_name);
>>  		if (strcmp(strtab + idx, "main_extable_sort_needed") == 0) {
>>  			sort_needed_sym = sym;
>>  			break;
>> @@ -178,9 +179,9 @@ do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
>>  	}
>>  	sort_needed_sec = &shdr[r2(&sort_needed_sym->st_shndx)];
>>  	sort_done_location = (void *)ehdr +
>> -		_r(&sort_needed_sec->sh_offset) +
>> -		_r(&sort_needed_sym->st_value) -
>> -		_r(&sort_needed_sec->sh_addr);
>> +		_r((void *)&sort_needed_sec->sh_offset) +
>> +		_r((void *)&sort_needed_sym->st_value) -
>> +		_r((void *)&sort_needed_sec->sh_addr);
>>  
>>  #if 0
>>  	printf("sort done marker at %lx\n",
>>
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Daniel Tang July 3, 2013, 12:12 p.m. UTC | #3
Hi,

On 03/07/2013, at 10:07 PM, Michal Marek <mmarek@suse.cz> wrote:

> On 3.7.2013 14:06, Michal Marek wrote:
>> Added David Daney to CC.
> 
> Second attempt, sorry.
> 
> 
>> On 9.6.2013 04:33, Daniel Tang wrote:
>>> The pointer passed to the _r() macro does not always match the type
>>> of the function that it is aliasing and raises several of the following
>>> warnings at compile time:
>>> 
>>> warning: passing argument 1 of ‘r8’ from incompatible pointer type
>> 
>> In what environment (arch, compiler, glibc) are you seeing this?
>> 

I'm cross compiling the ARM arch with gcc version 4.7.2 on 64 bit OS X. It should throw that warning on any 64 bit environment (not just OS X) but I haven't tested it.

If you want, I can look a little deeper into this.

Cheers,
tangrs--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Michal Marek July 3, 2013, 12:28 p.m. UTC | #4
On 3.7.2013 14:12, Daniel Tang wrote:
>> On 3.7.2013 14:06, Michal Marek wrote:
>>> On 9.6.2013 04:33, Daniel Tang wrote:
>>>> The pointer passed to the _r() macro does not always match the
>>>> type of the function that it is aliasing and raises several of
>>>> the following warnings at compile time:
>>>> 
>>>> warning: passing argument 1 of ‘r8’ from incompatible pointer
>>>> type
>>> 
>>> In what environment (arch, compiler, glibc) are you seeing this?
>>> 
> 
> I'm cross compiling the ARM arch with gcc version 4.7.2 on 64 bit OS
> X. It should throw that warning on any 64 bit environment (not just
> OS X) but I haven't tested it.

The cross compilation target should not matter, this is a host program.
It does work for me on Linux (openSUSE 12.3 FWIW), with gcc 4.7.2 and
glibc 2.17:

$ gcc -m64 -Wall -Wmissing-prototypes -Wstrict-prototypes -O2
-fomit-frame-pointer -Itools/include -o scripts/sortextable
scripts/sortextable.c; echo $?
0

What is the type of Elf64_Shdr::sh_offset in OS X's <elf.h>? In glibc,
this is Elf64_Off, which is a typedef name for uint64_t.

Michal
--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Daniel Tang July 3, 2013, 12:37 p.m. UTC | #5
Hi,

On 03/07/2013, at 10:28 PM, Michal Marek <mmarek@suse.cz> wrote:
> 
> 
> What is the type of Elf64_Shdr::sh_offset in OS X's <elf.h>? In glibc,
> this is Elf64_Off, which is a typedef name for uint64_t.

Huh, that's weird. Elf64_Off is defined as unsigned long in my elf.h which isn't 64 bit on x86_64 pretty sure.

It's a problem on my side then, apologies.

> 
> Michal

Cheers,
tangrs--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Michal Marek July 3, 2013, 12:57 p.m. UTC | #6
On 3.7.2013 14:37, Daniel Tang wrote:
> Hi,
> 
> On 03/07/2013, at 10:28 PM, Michal Marek <mmarek@suse.cz> wrote:
>> 
>> 
>> What is the type of Elf64_Shdr::sh_offset in OS X's <elf.h>? In
>> glibc, this is Elf64_Off, which is a typedef name for uint64_t.
> 
> Huh, that's weird. Elf64_Off is defined as unsigned long in my elf.h
> which isn't 64 bit on x86_64 pretty sure.

unsigned long _is_ 64bit on x86_64 Linux (or any 64bit Linux), but it
might not be the case on OS X. But then, the <elf.h> on that platform
should use something that is actually 64bit for Elf64_Off.


> It's a problem on my side then, apologies.

If Elf64_Off is really defined as an 32bit integer on OS X, then yes.

Michal
--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Michal Marek July 3, 2013, 1:15 p.m. UTC | #7
On 3.7.2013 14:57, Michal Marek wrote:
> On 3.7.2013 14:37, Daniel Tang wrote:
>> Hi,
>>
>> On 03/07/2013, at 10:28 PM, Michal Marek <mmarek@suse.cz> wrote:
>>>
>>>
>>> What is the type of Elf64_Shdr::sh_offset in OS X's <elf.h>? In
>>> glibc, this is Elf64_Off, which is a typedef name for uint64_t.
>>
>> Huh, that's weird. Elf64_Off is defined as unsigned long in my elf.h
>> which isn't 64 bit on x86_64 pretty sure.
> 
> unsigned long _is_ 64bit on x86_64 Linux (or any 64bit Linux), but it
> might not be the case on OS X. But then, the <elf.h> on that platform
> should use something that is actually 64bit for Elf64_Off.

Hm, according to
https://developer.apple.com/library/mac/documentation/Darwin/Conceptual/64bitPorting/transition/transition.html,
64bit OS X uses that same model as Linux, i.e. sizeof(long) ==
sizeof(void*). So the warning is probably caused by the fact that the
typedefs Elf64_Off and uint64_t are not identical (even though the types
have the same size). How are these defined on OS X?

Thanks,
Michal
--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/scripts/sortextable.h b/scripts/sortextable.h
index f5eb43d..0a38fbd 100644
--- a/scripts/sortextable.h
+++ b/scripts/sortextable.h
@@ -110,9 +110,9 @@  do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
 	int i;
 	int idx;
 
-	shdr = (Elf_Shdr *)((char *)ehdr + _r(&ehdr->e_shoff));
+	shdr = (Elf_Shdr *)((char *)ehdr + _r((void *)&ehdr->e_shoff));
 	shstrtab_sec = shdr + r2(&ehdr->e_shstrndx);
-	secstrtab = (const char *)ehdr + _r(&shstrtab_sec->sh_offset);
+	secstrtab = (const char *)ehdr + _r((void *)&shstrtab_sec->sh_offset);
 	for (i = 0; i < r2(&ehdr->e_shnum); i++) {
 		idx = r(&shdr[i].sh_name);
 		if (strcmp(secstrtab + idx, "__ex_table") == 0) {
@@ -122,8 +122,8 @@  do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
 		if ((r(&shdr[i].sh_type) == SHT_REL ||
 		     r(&shdr[i].sh_type) == SHT_RELA) &&
 		    r(&shdr[i].sh_info) == extab_index) {
-			relocs = (void *)ehdr + _r(&shdr[i].sh_offset);
-			relocs_size = _r(&shdr[i].sh_size);
+			relocs = (void *)ehdr + _r((void *)&shdr[i].sh_offset);
+			relocs_size = _r((void *)&shdr[i].sh_size);
 		}
 		if (strcmp(secstrtab + idx, ".symtab") == 0)
 			symtab_sec = shdr + i;
@@ -142,14 +142,14 @@  do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
 		fprintf(stderr,	"no __ex_table in  file: %s\n", fname);
 		fail_file();
 	}
-	strtab = (const char *)ehdr + _r(&strtab_sec->sh_offset);
+	strtab = (const char *)ehdr + _r((void *)&strtab_sec->sh_offset);
 
-	extab_image = (void *)ehdr + _r(&extab_sec->sh_offset);
+	extab_image = (void *)ehdr + _r((void *)&extab_sec->sh_offset);
 
 	if (custom_sort) {
-		custom_sort(extab_image, _r(&extab_sec->sh_size));
+		custom_sort(extab_image, _r((void *)&extab_sec->sh_size));
 	} else {
-		int num_entries = _r(&extab_sec->sh_size) / extable_ent_size;
+		int num_entries = _r((void *)&extab_sec->sh_size) / extable_ent_size;
 		qsort(extab_image, num_entries,
 		      extable_ent_size, compare_extable);
 	}
@@ -159,12 +159,13 @@  do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
 
 	/* find main_extable_sort_needed */
 	sort_needed_sym = NULL;
-	for (i = 0; i < _r(&symtab_sec->sh_size) / sizeof(Elf_Sym); i++) {
-		sym = (void *)ehdr + _r(&symtab_sec->sh_offset);
+	for (i = 0; i < _r((void *)&symtab_sec->sh_size) / sizeof(Elf_Sym); i++)
+	{
+		sym = (void *)ehdr + _r((void *)&symtab_sec->sh_offset);
 		sym += i;
 		if (ELF_ST_TYPE(sym->st_info) != STT_OBJECT)
 			continue;
-		idx = r(&sym->st_name);
+		idx = r((void *)&sym->st_name);
 		if (strcmp(strtab + idx, "main_extable_sort_needed") == 0) {
 			sort_needed_sym = sym;
 			break;
@@ -178,9 +179,9 @@  do_func(Elf_Ehdr *ehdr, char const *const fname, table_sort_t custom_sort)
 	}
 	sort_needed_sec = &shdr[r2(&sort_needed_sym->st_shndx)];
 	sort_done_location = (void *)ehdr +
-		_r(&sort_needed_sec->sh_offset) +
-		_r(&sort_needed_sym->st_value) -
-		_r(&sort_needed_sec->sh_addr);
+		_r((void *)&sort_needed_sec->sh_offset) +
+		_r((void *)&sort_needed_sym->st_value) -
+		_r((void *)&sort_needed_sec->sh_addr);
 
 #if 0
 	printf("sort done marker at %lx\n",