diff options
| author | Ulrich Drepper <[email protected]> | 2007-10-16 05:21:27 +0000 |
|---|---|---|
| committer | Ulrich Drepper <[email protected]> | 2007-10-16 05:21:27 +0000 |
| commit | b597dfad924980dede10d7c19d87900b6172e599 (patch) | |
| tree | 3c090b69070ad0056d479d90aa1f8829810140ba /libebl/eblobjnote.c | |
| parent | 3fc3d7bd6bd8485404a936f7354e781dc2be6a5a (diff) | |
merge of '92c36bfdbc6468d1711c043b530e0dfe5abb6dec'
and 'c22c8c43f8f68b0bffd4d5ccdb2282c958268742'
Diffstat (limited to 'libebl/eblobjnote.c')
| -rw-r--r-- | libebl/eblobjnote.c | 86 |
1 files changed, 49 insertions, 37 deletions
diff --git a/libebl/eblobjnote.c b/libebl/eblobjnote.c index 747fb8e7..836ac8dc 100644 --- a/libebl/eblobjnote.c +++ b/libebl/eblobjnote.c @@ -81,48 +81,60 @@ ebl_object_note (ebl, name, type, descsz, desc) } break; - case NT_VERSION: - if (strcmp (name, "GNU") == 0 && descsz >= 8) + case NT_GNU_ABI_TAG: + if (strcmp (name, "GNU") == 0 && descsz >= 8 && descsz % 4 == 0) { - struct - { - uint32_t os; - uint32_t version[descsz / 4 - 1]; - } *tag = (__typeof (tag)) desc; - - const char *os; - switch (tag->os) + Elf_Data in = { - case ELF_NOTE_OS_LINUX: - os = "Linux"; - break; - - case ELF_NOTE_OS_GNU: - os = "GNU"; - break; - - case ELF_NOTE_OS_SOLARIS2: - os = "Solaris"; - break; - - case ELF_NOTE_OS_FREEBSD: - os = "FreeBSD"; - break; - - default: - os = "???"; - break; - } + .d_version = EV_CURRENT, + .d_type = ELF_T_WORD, + .d_size = descsz, + .d_buf = (void *) desc + }; + uint32_t buf[descsz / 4]; + Elf_Data out = + { + .d_version = EV_CURRENT, + .d_type = ELF_T_WORD, + .d_size = descsz, + .d_buf = buf + }; - printf (gettext (" OS: %s, ABI: "), os); - size_t cnt; - for (cnt = 0; cnt < descsz / 4 - 1; ++cnt) + if (elf32_xlatetom (&out, &in, ebl->data) != NULL) { - if (cnt != 0) - putchar_unlocked ('.'); - printf ("%" PRIu32, tag->version[cnt]); + const char *os; + switch (buf[0]) + { + case ELF_NOTE_OS_LINUX: + os = "Linux"; + break; + + case ELF_NOTE_OS_GNU: + os = "GNU"; + break; + + case ELF_NOTE_OS_SOLARIS2: + os = "Solaris"; + break; + + case ELF_NOTE_OS_FREEBSD: + os = "FreeBSD"; + break; + + default: + os = "???"; + break; + } + + printf (gettext (" OS: %s, ABI: "), os); + for (size_t cnt = 1; cnt < descsz / 4; ++cnt) + { + if (cnt > 1) + putchar_unlocked ('.'); + printf ("%" PRIu32, buf[cnt]); + } + putchar_unlocked ('\n'); } - putchar_unlocked ('\n'); break; } /* FALLTHROUGH */ |
