[apitrace] Split off libs package, allow tracing 32bit apps on 64bit platforms
Sandro Mani
smani at fedoraproject.org
Fri Mar 7 21:12:58 UTC 2014
commit 0c20af6c32dfa363a85430144756eb55912b69e2
Author: Sandro Mani <manisandro at gmail.com>
Date: Fri Mar 7 22:12:44 2014 +0100
Split off libs package, allow tracing 32bit apps on 64bit platforms
apitrace-4.0_resources.patch | 44 ------------
apitrace-4.0_support-32bit-preload.patch | 107 ++++++++++++++++++++++++++++++
apitrace.spec | 20 +++++-
3 files changed, 126 insertions(+), 45 deletions(-)
---
diff --git a/apitrace-4.0_resources.patch b/apitrace-4.0_resources.patch
index 9e715dd..f3f233b 100644
--- a/apitrace-4.0_resources.patch
+++ b/apitrace-4.0_resources.patch
@@ -1,50 +1,6 @@
diff -rupN apitrace-4.0/cli/cli_resources.cpp apitrace-4.0-new/cli/cli_resources.cpp
--- apitrace-4.0/cli/cli_resources.cpp 2013-05-02 09:05:06.000000000 +0200
+++ apitrace-4.0-new/cli/cli_resources.cpp 2013-11-13 23:01:42.288012440 +0100
-@@ -63,42 +63,13 @@ os::String
- findWrapper(const char *wrapperFilename)
- {
- os::String wrapperPath;
--
-- os::String processDir = os::getProcessName();
-- processDir.trimFilename();
--
-- // Try relative build directory
-- // XXX: Just make build and install directory layout match
-- wrapperPath = processDir;
-+ wrapperPath = APITRACE_LIB_DIR;
- wrapperPath.join("wrappers");
- wrapperPath.join(wrapperFilename);
- if (wrapperPath.exists()) {
- return wrapperPath;
- }
-
-- // Try relative install directory
-- wrapperPath = processDir;
--#if defined(_WIN32)
-- wrapperPath.join("..\\lib\\wrappers");
--#elif defined(__APPLE__)
-- wrapperPath.join("../lib/wrappers");
--#else
-- wrapperPath.join("../lib/apitrace/wrappers");
--#endif
-- wrapperPath.join(wrapperFilename);
-- if (wrapperPath.exists()) {
-- return wrapperPath;
-- }
--
--#ifndef _WIN32
-- // Try absolute install directory
-- wrapperPath = APITRACE_WRAPPERS_INSTALL_DIR;
-- wrapperPath.join(wrapperFilename);
-- if (wrapperPath.exists()) {
-- return wrapperPath;
-- }
--#endif
--
- return "";
- }
-
@@ -106,44 +77,13 @@ os::String
findScript(const char *scriptFilename)
{
diff --git a/apitrace-4.0_support-32bit-preload.patch b/apitrace-4.0_support-32bit-preload.patch
new file mode 100644
index 0000000..93c54eb
--- /dev/null
+++ b/apitrace-4.0_support-32bit-preload.patch
@@ -0,0 +1,107 @@
+diff -rupN apitrace-4.0/cli/cli_resources.cpp apitrace-4.0-new/cli/cli_resources.cpp
+--- apitrace-4.0/cli/cli_resources.cpp 2013-05-02 09:05:06.000000000 +0200
++++ apitrace-4.0-new/cli/cli_resources.cpp 2014-03-07 22:09:42.186333361 +0100
+@@ -32,6 +32,45 @@
+
+ #include "cli_resources.hpp"
+
++#include <fstream>
++
++// Stolen from elfio
++#define EI_NIDENT 16
++#define EI_MAG0 0
++#define EI_MAG1 1
++#define EI_MAG2 2
++#define EI_MAG3 3
++#define EI_CLASS 4
++#define ELFMAG0 0x7F
++#define ELFMAG1 'E'
++#define ELFMAG2 'L'
++#define ELFMAG3 'F'
++#define ELFCLASSNONE 0
++#define ELFCLASS32 1
++#define ELFCLASS64 2
++
++int get_elf_class(const char* filename) {
++ std::ifstream stream;
++ stream.open( filename, std::ios::in | std::ios::binary );
++ if ( !stream ) {
++ return ELFCLASSNONE;
++ }
++ unsigned char e_ident[EI_NIDENT];
++
++ // Read ELF file signature
++ stream.seekg( 0 );
++ stream.read( reinterpret_cast<char*>( &e_ident ), sizeof( e_ident ) );
++
++ // Is it ELF file?
++ if ( stream.gcount() != sizeof( e_ident ) ||
++ e_ident[EI_MAG0] != ELFMAG0 ||
++ e_ident[EI_MAG1] != ELFMAG1 ||
++ e_ident[EI_MAG2] != ELFMAG2 ||
++ e_ident[EI_MAG3] != ELFMAG3 ) {
++ return ELFCLASSNONE;
++ }
++ return e_ident[EI_CLASS];
++}
+
+ os::String
+ findProgram(const char*programFilename)
+@@ -60,7 +99,7 @@ findProgram(const char*programFilename)
+ }
+
+ os::String
+-findWrapper(const char *wrapperFilename)
++findWrapper(const char *wrapperFilename, const char *argv0)
+ {
+ os::String wrapperPath;
+
+@@ -83,8 +122,24 @@ findWrapper(const char *wrapperFilename)
+ #elif defined(__APPLE__)
+ wrapperPath.join("../lib/wrappers");
+ #else
++ // If we are on a 64-bit architecture, support tracing 32-bit executables by preloading the appropriate shared library
++#ifdef __LP64__
++ int elfclass = get_elf_class(argv0);
++ if(elfclass == ELFCLASS32) {
++ wrapperPath.join("../lib/apitrace/wrappers");
++ if (!wrapperPath.exists()) {
++ std::cerr << "32-bit wrapper libraries not found, please install apitrace-libs.i686" << std::endl;
++ }
++ } else if(elfclass == ELFCLASS64) {
++ wrapperPath.join("../lib64/apitrace/wrappers");
++ } else if(elfclass == ELFCLASSNONE) {
++ std::cerr << "error: failed to determine elf class for " << argv0 << ", assuming ELFCLASS64" << std::endl;
++ wrapperPath.join("../lib64/apitrace/wrappers");
++ }
++#else
+ wrapperPath.join("../lib/apitrace/wrappers");
+ #endif
++#endif
+ wrapperPath.join(wrapperFilename);
+ if (wrapperPath.exists()) {
+ return wrapperPath;
+diff -rupN apitrace-4.0/cli/cli_resources.hpp apitrace-4.0-new/cli/cli_resources.hpp
+--- apitrace-4.0/cli/cli_resources.hpp 2013-05-02 09:05:06.000000000 +0200
++++ apitrace-4.0-new/cli/cli_resources.hpp 2014-02-22 23:47:43.917645323 +0100
+@@ -40,7 +40,7 @@ os::String
+ findScript(const char *name);
+
+ os::String
+-findWrapper(const char *wrapperFilename);
++findWrapper(const char *wrapperFilename, const char *argv0);
+
+
+ #endif /* _CLI_RESOURCES_HPP_ */
+diff -rupN apitrace-4.0/cli/cli_trace.cpp apitrace-4.0-new/cli/cli_trace.cpp
+--- apitrace-4.0/cli/cli_trace.cpp 2013-05-02 09:05:06.000000000 +0200
++++ apitrace-4.0-new/cli/cli_trace.cpp 2014-03-07 22:06:51.312093308 +0100
+@@ -126,7 +126,7 @@ traceProgram(trace::API api,
+ return 1;
+ }
+
+- os::String wrapperPath = findWrapper(wrapperFilename);
++ os::String wrapperPath = findWrapper(wrapperFilename, argv[0]);
+ if (!wrapperPath.length()) {
+ std::cerr << "error: failed to find " << wrapperFilename << "\n";
+ goto exit;
diff --git a/apitrace.spec b/apitrace.spec
index 7de4965..1e802e4 100644
--- a/apitrace.spec
+++ b/apitrace.spec
@@ -1,6 +1,6 @@
Name: apitrace
Version: 4.0
-Release: 4%{?dist}
+Release: 5%{?dist}
Summary: Tools for tracing OpenGL
License: MIT
@@ -15,6 +15,8 @@ Patch1: apitrace-4.0_libdir.patch
Patch2: apitrace-4.0_resources.patch
# Remove gzguts.h requirement (not upstreamable, needed for Patch0)
Patch3: apitrace-4.0_gzguts.patch
+# Support tracing 32bit binaries on 64bit
+Patch4: apitrace-4.0_support-32bit-preload.patch
BuildRequires: cmake
BuildRequires: qtwebkit-devel
@@ -24,6 +26,7 @@ BuildRequires: snappy-devel
BuildRequires: qjson-devel
BuildRequires: desktop-file-utils
+Requires: %{name}-libs%{_isa} = %{version}-%{release}
# scripts/snapdiff.py
Requires: python-pillow
@@ -36,6 +39,14 @@ apitrace consists of a set of tools to:
* visualize and edit trace files
+%package libs
+Summary: Libraries used by apitrace
+Requires: %{name} = %{version}-%{release}
+
+%description libs
+Libraries used by apitrace
+
+
%package gui
Summary: Graphical frontend for apitrace
Requires: %{name}%{_isa} = %{version}-%{release}
@@ -50,6 +61,7 @@ This package contains qapitrace, the Graphical frontend for apitrace.
%patch1 -p1
%patch2 -p1
%patch3 -p1
+%patch4 -p1
# Remove bundled libraries, except khronos headers
rm -rf `ls -1 thirdparty | grep -v khronos`
@@ -89,6 +101,8 @@ chmod 0644 %{buildroot}%{_libdir}/%{name}/scripts/highlight.py
%{_bindir}/apitrace
%{_bindir}/eglretrace
%{_bindir}/glretrace
+
+%files libs
%{_libdir}/%{name}/
%files gui
@@ -98,6 +112,10 @@ chmod 0644 %{buildroot}%{_libdir}/%{name}/scripts/highlight.py
%changelog
+* Sat Mar 07 2014 Sandro Mani <manisandro at gmail.com> - 4.0-5
+- Split off libs package
+- Allow tracing 32bit binaries on 64bit
+
* Mon Nov 18 2013 Sandro Mani <manisandro at gmail.com> - 4.0-4
- chmod 0644 scripts/highlight.py
- Fix all python shebangs according to fedora guidelines
More information about the scm-commits
mailing list