amd64/127276: ldd invokes linux yes
Shuichi KITAGUCHI
ki at hh.iij4u.or.jp
Tue May 4 04:00:09 UTC 2010
The following reply was made to PR amd64/127276; it has been noted by GNATS.
From: Shuichi KITAGUCHI <ki at hh.iij4u.or.jp>
To: bug-followup at FreeBSD.org, kamikaze at bsdforen.de
Cc:
Subject: Re: amd64/127276: ldd invokes linux yes
Date: Tue, 04 May 2010 12:21:45 +0900 (JST)
----Next_Part(Tue_May_04_12_21_45_2010_795)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Hello,
I investigate this problem today and found that Linux's ld.so
accepts "LD_TRACE_LOADED_OBJECTS".
% env LD_TRACE_LOADED_OBJECTS=yes /compat/linux/bin/ls
librt.so.1 => /lib/librt.so.1 (0x28087000)
libselinux.so.1 => /lib/libselinux.so.1 (0x28092000)
libcap.so.2 => /lib/libcap.so.2 (0x280af000)
libacl.so.1 => /lib/libacl.so.1 (0x280b4000)
libc.so.6 => /lib/libc.so.6 (0x280bc000)
libpthread.so.0 => /lib/libpthread.so.0 (0x28234000)
/lib/ld-linux.so.2 (0x28063000)
libdl.so.2 => /lib/libdl.so.2 (0x2824e000)
libattr.so.1 => /lib/libattr.so.1 (0x28254000)
I think environment variable "LD_32_TRACE_LOADED_OBJECTS" is
FreeBSD specific, and "LD_TRACE_LOADED_OBJECTS" should be passed
to other binaries.
Attached patch is reasonable?
--
Shuichi KITAGUCHI // kit at ysnb.net / ki at hh.iij4u.or.jp
----Next_Part(Tue_May_04_12_21_45_2010_795)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="ldd.c.patch"
--- ldd.c.old 2009-09-19 21:45:17.000000000 +0900
+++ ldd.c 2010-05-04 11:48:42.000000000 +0900
@@ -65,7 +65,7 @@
#endif
static int is_executable(const char *fname, int fd, int *is_shlib,
- int *type);
+ int *osabi, int *type);
static void usage(void);
#define TYPE_UNKNOWN 0
@@ -177,14 +177,14 @@
rval = 0;
for (; argc > 0; argc--, argv++) {
- int fd, status, is_shlib, rv, type;
+ int fd, status, is_shlib, rv, type, osabi;
if ((fd = open(*argv, O_RDONLY, 0)) < 0) {
warn("%s", *argv);
rval |= 1;
continue;
}
- rv = is_executable(*argv, fd, &is_shlib, &type);
+ rv = is_executable(*argv, fd, &is_shlib, &osabi, &type);
close(fd);
if (rv == 0) {
rval |= 1;
@@ -197,6 +197,8 @@
break;
#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED)
case TYPE_ELF32:
+ if (osabi != ELFOSABI_FREEBSD)
+ break;
rval |= execldd32(*argv, fmt1, fmt2, aflag, vflag);
continue;
#endif
@@ -267,7 +269,7 @@
}
static int
-is_executable(const char *fname, int fd, int *is_shlib, int *type)
+is_executable(const char *fname, int fd, int *is_shlib, int *osabi, int *type)
{
union {
struct exec aout;
@@ -300,6 +302,8 @@
return (1);
}
+ *osabi = hdr.elf.e_ident[EI_OSABI];
+
#if __ELF_WORD_SIZE > 32 && defined(ELF32_SUPPORTED)
if ((size_t)n >= sizeof(hdr.elf32) && IS_ELF(hdr.elf32) &&
hdr.elf32.e_ident[EI_CLASS] == ELFCLASS32) {
----Next_Part(Tue_May_04_12_21_45_2010_795)----
More information about the freebsd-amd64
mailing list