ldd runs linux programs
Konstantin Belousov
kostikbel at gmail.com
Sun Aug 4 06:51:24 UTC 2013
On Sun, Aug 04, 2013 at 12:17:34AM -0400, Mark Johnston wrote:
> I spent some time trying to figure out if there was any reason for this
> and didn't come up with anything. Does the patch below look ok? It just
> adds a couple of macros to set both the native and 32-bit compat
> variable. It works properly for me for 32-bit, native, and (32-bit)
> Linux executables and shared libs on an amd64 machine.
>
> diff --git a/usr.bin/ldd/ldd.c b/usr.bin/ldd/ldd.c
> index 00c8797..39f38e8 100644
> --- a/usr.bin/ldd/ldd.c
> +++ b/usr.bin/ldd/ldd.c
> @@ -49,12 +49,6 @@ __FBSDID("$FreeBSD$");
>
> #include "extern.h"
>
> -#ifdef COMPAT_32BIT
> -#define LD_ "LD_32_"
> -#else
> -#define LD_ "LD_"
> -#endif
> -
> /*
> * 32-bit ELF data structures can only be used if the system header[s] declare
> * them. There is no official macro for determining whether they are declared,
> @@ -76,13 +70,23 @@ static void usage(void);
>
> #define _PATH_LDD32 "/usr/bin/ldd32"
>
> +#define LDD_SETENV(name, value, overwrite) do { \
> + setenv("LD_" name, value, overwrite); \
> + setenv("LD_32_" name, value, overwrite); \
> +} while (0)
> +
> +#define LDD_UNSETENV(name) do { \
> + unsetenv("LD_" name); \
> + unsetenv("LD_32_" name); \
> +} while (0)
> +
> static int
> execldd32(char *file, char *fmt1, char *fmt2, int aflag, int vflag)
> {
> char *argv[8];
> int i, rval, status;
>
> - unsetenv(LD_ "TRACE_LOADED_OBJECTS");
> + LDD_UNSETENV("TRACE_LOADED_OBJECTS");
> rval = 0;
> i = 0;
> argv[i++] = strdup(_PATH_LDD32);
> @@ -121,7 +125,7 @@ execldd32(char *file, char *fmt1, char *fmt2, int aflag, int vflag)
> }
> while (i--)
> free(argv[i]);
> - setenv(LD_ "TRACE_LOADED_OBJECTS", "yes", 1);
> + LDD_SETENV("TRACE_LOADED_OBJECTS", "yes", 1);
> return (rval);
> }
> #endif
> @@ -210,15 +214,15 @@ main(int argc, char *argv[])
> }
>
> /* ld.so magic */
> - setenv(LD_ "TRACE_LOADED_OBJECTS", "yes", 1);
> + LDD_SETENV("TRACE_LOADED_OBJECTS", "yes", 1);
> if (fmt1 != NULL)
> - setenv(LD_ "TRACE_LOADED_OBJECTS_FMT1", fmt1, 1);
> + LDD_SETENV("TRACE_LOADED_OBJECTS_FMT1", fmt1, 1);
> if (fmt2 != NULL)
> - setenv(LD_ "TRACE_LOADED_OBJECTS_FMT2", fmt2, 1);
> + LDD_SETENV("TRACE_LOADED_OBJECTS_FMT2", fmt2, 1);
>
> - setenv(LD_ "TRACE_LOADED_OBJECTS_PROGNAME", *argv, 1);
> + LDD_SETENV("TRACE_LOADED_OBJECTS_PROGNAME", *argv, 1);
> if (aflag)
> - setenv(LD_ "TRACE_LOADED_OBJECTS_ALL", "1", 1);
> + LDD_SETENV("TRACE_LOADED_OBJECTS_ALL", "1", 1);
> else if (fmt1 == NULL && fmt2 == NULL)
> /* Default formats */
> printf("%s:\n", *argv);
This looks fine to me.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 834 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-current/attachments/20130804/42477a80/attachment.sig>
More information about the freebsd-current
mailing list