strace seg with select and -ve nfds

Denys Vlasenko dvlasenk at redhat.com
Wed Nov 6 10:54:59 UTC 2013


On 11/05/2013 07:27 PM, Dr. David Alan Gilbert wrote:
> * Denys Vlasenko (dvlasenk at redhat.com) wrote:
>> On the related note, how are we doing in "stracing 32-bit app
>> with 64-bit strace on a big-endian machine" case?
>> In that case, sizeof(long) is important...
>> I dread to think about that:(
> 
> Yeh that's kind of related to the question I asked in my 1st post;
> since we're getting passed args here as long* and this is actually
> an int does this work at all on BE machines?
> Is there GET_ARG_INT thing in strace this routine should be using?

You misunderstood me. The question is not about arg being longs
or ints - that is properly covered (or else EVERY syscall would be
horribly broken).

I'm talking about the long[] arrays pointed by arg[1,2,3].
In 32-bit process, those arrays have 32-bit "longs".
If strace is 64-bit, strace's "longs" are 64-bit.

Finding an Nth bit via

	long_array[fd / BITS_PER_LONG] & (1UL << (fd % BITS_PER_LONG))

works if we have a correct idea about sizeof(long),
and it also works correctly on little endian
even if we don't:

	fd = 32
	if long is 32-bit:
		long_array[1] & (1 << 0) -- checks bit 0 in 4th byte
	if long is 64-bit:
		long_array[0] & (1 << 32) -- checks bit 0 in 4th byte

But on big-endian we have a disaster

	fd = 32
	if long is 32-bit:
		long_array[1] & (1 << 0) -- checks bit 0 in 7th byte
	if long is 64-bit:
		long_array[0] & (1 << 32) -- checks bit 0 in 3rd byte

NOT THE SAME!


> Yeh mixed ABI is hard - and things mix ABI in different ways,
> some systems have to have it in different processes (in which
> case two strace binaries might do it)

This won't work if you want to strace across execve which execs
a different-bitness process.




More information about the Strace-devel mailing list