calling select, via syscall, on 64 bit Leopard.
calling select, via syscall, on 64 bit Leopard.
- Subject: calling select, via syscall, on 64 bit Leopard.
- From: Luke Daley <email@hidden>
- Date: Wed, 3 Sep 2008 19:48:43 +1000
Hi,
This was the select and svn discussion, but we have narrowed the
problem down to syscall() on 64 bit Leopard so I am starting a new
thread.
`man syscall` tells us that you need to use __syscall() on 64 bit
architectures. The problem with that though is that __syscall() is in
libSystem, but is not exported. Jean-Daniel Dupas then contributed
this code to get to __syscall()…
#include <libc.h>
#include <mach-o/nlist.h>
typedef int (*__syscall_t)(quad_t number, ...);
int main(int argc, const char * argv[]) {
struct nlist nl[1];
bzero(&nl, sizeof(struct nlist) * 2);
nl[0].n_un.n_name = (char *)"___syscall";
if (nlist("/usr/lib/libSystem.dylib", nl) < 0 || nl[0].n_type ==
N_UNDF) {
fprintf(stderr, "nlist(%s, %s) failed\n",
"/usr/lib/libSystem.dylib",
nl[0].n_un.n_name);
return -1;
}
__syscall_t fcn = (__syscall_t)nl[0].n_value;
return 0;
}
Except that gives "error: ‘union <anonymous>’ has no member named
‘n_name’".
Looking at mach-o/nlist.h…
struct nlist {
union {
#ifndef __LP64__
char *n_name; /* for use when in-core */
#endif
int32_t n_strx; /* index into the string table */
} n_un;
uint8_t n_type; /* type flag, see below */
uint8_t n_sect; /* section number or NO_SECT */
int16_t n_desc; /* see <mach-o/stab.h> */
uint32_t n_value; /* value of this symbol (or stab offset) */
};
That looks to me line n_name isn't there on 64 bit architectures.
Can I get at this any other way?
--
LD.
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden