SlideShare une entreprise Scribd logo
1  sur  50
Télécharger pour lire hors ligne
Strategies to improve embedded
Linux applications’ performance
   beyond ordinary techniques
         Anderson Medeiros
       Software Engineer, Motorola
             André Oriani
       Software Engineer, Motorola
Agenda



•  The performance problem faced by Motorola’s IM team
•  Linux’s Dynamic Loader
•  Prelink
•  Libraries Tools
•  Dymically loading Libraries
•  Tuning Shared Libraries
•  UI Time Perception
•  Q & A
Motivation
Our Problem
The basic recipe



Measure


Analyze


Optimize
Our Discover




User clicks   fork()                    main()   Screen.show()



                       DYNAMIC LOADER



                                                      t
Linux’s Dynamic Loader
Loading a dynamically
                              linked program

   .interp
                                        A


Load dynamic
    linker                                         .rel.text
                                    Relocation
                                                  .rel.data

  .dynamic
               Libraries               .init

Dependency
  libraries
                                    Program’s
               Symbol               entry point
                tables
     A
A closer look at relocation

  Relative              Symbol-based
               Type

                                                                Lookup failed
                            Symbol’s
Compute
                              hash                                    Yes
 offset

                                                                  Lookup
                             Hash          Next            No
                                                                   scope
Add load                     bucket        object                  empty
 address

                      Yes                   Next
                             Match
                                           element
                                No         No
           Adjust
                                           Chain     Yes
           address
                                           empty
prelink
Motivation
How does prelink work? I

•  Collects ELF binaries which should be prelinked and all the ELF
   shared libraries they depend on
•  Assigns a unique virtual address space slot for each library and
   relinks the shared library to that base address
•  Resolves all relocations in the binary or library against its
   dependant libraries and stores the relocations into the ELF object
•  Stores a list of all dependant libraries together with their
   checksums into the binary or library
•  For binaries, it also computes a list of conflicts and stores it into a
   special ELF section



      Note: Libraries shall be compiled with the GCC option -fPIC
How does prelink work? II


•  At runtime, the dynamic linker first checks if it is prelinked itself
•  Just before starting an application, the dynamic linker checks if:
   •  There is a library list section created by prelink
   •  They are present in symbol search scope in the same order
   •  None have been modified since prelinking
   •  There aren’t any new shared libraries loaded either
•  If all conditions are satisfied, prelinking is used:
   •  Dynamic linker processes the fixup section and skips all normal
      relocation handling
•  If at least one condition fails:
   •  Dynamic linker continues with normal relocation processing in the
      executable and all shared libraries
Results




          t
Library tools
How to use prelink?


•  prelink –avf --ld-library-path=PATH --dynamic-linker=LDSO
   •  -a --all
       •  Prelink all binaries and dependant libraries found in directory hierarchies
          specified in /etc/prelink.conf
   •  -v --verbose
       •  Verbose mode. Print the virtual address slot assignment to libraries
   •  -f --force
       •  Force re-prelinking even for already prelinked objects for which no
           dependencies changed
   •  --ld-library-path=PATH
       •  Specify special LD_LIBRARY_PATH to be used when prelink queries
          dynamic linker about symbol resolution details
   •  --dynamic-linker=LDSO
       •  Specify alternate dynamic linker instead of the default
Dynamically Loading Libraries
Motivation
Motivation II




If there are any libraries you are going to use
   only on special occasions, it is better to load
   them when they are really needed.
The Basics

#include <dlfcn.h>

void*   dlopen    ( const char* filename, int flags);
void*   dlsym     ( void* handle, const char* symbol);
char*   dlerror   (void);
int     dlclose   (void* handle);




#echo Although you don’t have to link against the
 library
#echo you still have to link against libdl
#
#gcc main.cpp -ldl -o program
Loading C++ Libraries

                                C++ uses mangling!




int mod (int a , int b);                 _Z3sumii
float mod (float a, float b);            _Z3sumff




     math.cpp                                 math.o
The example



class Foo
{
     public:
        Foo(){}
        ~Foo(){}
        void bar(const char * msg)
        {
           std::cout<<"Msg:"<<msg<<std::endl;
        }
  };
The solution

Step 1 Define an interface for your class.




                                 Foo
                         + Foo()
                         + ~Foo()
                         + void bar(const char*)
The solution

Step 1 Define an interface for your class.


                              <<interface>>

                                 Foo
                         + virtual void bar(const
                         char*) = 0




                             FooImpl
                         + Foo()
                         + ~Foo()
                         + void bar(const char*)
The solution - Lib’s Header file

Step 1 Define an interface for your class



#ifndef FOO_H__
#define FOO_H__

class Foo
{
    public:
        virtual void bar (const char*) = 0;
};
The solution - Lib’s Header file

Step 2 Create “C functions” to create and destroy instances
  of your class
Step 3 You might want to create typedefs


 extern "C" Foo* createFoo();
 extern "C" void destroyFoo(Foo*);

 typedef Foo* (*createFoo_t) ();
 typedef void (*destroyFoo_t)(Foo*);

 #endif
The solution - Lib’s Implementation file


Step 4 Implement your interface and “C functions”

 #include "foo.h"                        Foo* createFoo()
 #include <iostream.h>                   {
                                            return new FooImpl();
 class FooImpl:public Foo                 }
 {
  public:                                void destroyFoo(Foo* foo)
    FooImpl(){}                          {
    virtual ~FooImpl(){}                   FooImpl* fooImpl =
    virtual void bar(const char * msg)    static_cast<FooImpl*>(foo);
    {                                      delete fooImpl;
      cout<<"Msg: "<<msg<<endl;          }
    }
 };
The solution - The program
#include <foo.h>
#include <assert.h>
#include <dlfcn.h>

int main()
{
   void* handle = dlopen("./libfoo.so",RTLD_LAZY);
   assert(handle);
   createFoo_t dyn_createFoo = (createFoo_t)dlsym(handle,"createFoo");
   assert(!dlerror());
   Foo* foo = dyn_createFoo();
   if(foo)
       foo->bar("The method bar is being called");
   destroyFoo_t dyn_destroyFoo = (destroyFoo_t)dlsym(handle,"destroyFoo");
   assert(!dlerror());
   dyn_destroyFoo(foo);
   dlclose(handle);
   return 0;
}
Tunning Shared Libraries
Inspiration




     “How To Write Shared Libraries”
          Ulrich Drepper- Red Hat
http://people.redhat.com/drepper/dsohowto.pdf
Less is always better

Keep at minimum…

•  The number of libraries you directly or indirectly depend
•  The size of libraries you link against shall have the smallest size possible
•  The number for search directories for libraries, ideally one directory
•  The number of exported symbols
•  The length of symbols strings
•  The numbers of relocations
Search directories for libs
Reducing search space

Step 1 Set LD_LIBRARY_PATH to empty

Step 2 When linking use the options:
   -rpath-link <dir> to the specify your system’s directory for
    libraries
   -z nodeflib to avoid searching on /lib, /usr/lib and others
    places specified by /etc/ld.so.conf and /etc/ld.so.cache



     #export LD_LIBRARY_PATH=“”
     #gcc main.cpp -Wl,-z,nodeflib -Wl,-rpath-link,/lib
     -lfoo -o program
Reducing exported symbols

Using GCC’s attribute feature

 int localVar __attribute__((visibility(“hidden”)));

 int localFunction() __attribute__((visibility(“hidden”)));

 class Someclass
 {
     private:
        static int a __attribute__((visibility(“hidden”)));
        int b;
        int doSomething(int d)__attribute__((visibility
   (“hidden”)));

      public:
         Someclass(int c);
         int doSomethingImportant();
 };
Reducing exported symbols II

{                                You can tell the linker which
    global:                      symbols shall be exported
     cFunction*;                 using export maps
    extern “C++”
    {
      cppFunction*;
      *Someclass;
      Someclass::Someclass*;    #g++ -shared example.cpp -o
      Someclass::?Someclass*;    libexample.so.1 -Wl,
      Someclass::method*        -soname=libexample.so.1 -Wl,-
    };                          -version-script=example.map

    local: *;

};
Pro and Cons

                Pros                                        Cons

Visibility attribute                         Visibility attribute
•  Compiler can generate optimal             •  GCC’s specific feature;
   code;                                     •  Code become less readable;



Export Maps                                  Export Maps
•  More practical;                           •  No optimization can be done by
•  Centralizes the definition of library’s      compiler because any symbol may
   API;                                         be exported
Restricting symbol string’s lenght

namespace java
{
    namespace lang
    {
       class Math
       {
         static const int PI;
         static double sin(double d);
         static double cos(double d);
         static double FastFourierTransform
               (double a, int b,const int** const c);

        };        _ZN4java4lang4Math2PIE
    }             _ZN4java4lang4Math3sinEd
}                 _ZN4java4lang4Math3cosEd
                  _ZN4java4lang4Math20FastFourierTransformEdiPPKi
Avoiding relocations



  char* a = “ABC”;                    A B C 0
                          .data



const char a[] = “ABC”;             A B C 0
                          .rodata

                                      ELF
UI Time perception
Motivation

X hours to deliver    X hours to deliver
    $ to ship             $ to ship
Package tracking         No tracking
Motivation II
Improving responsiveness

It is not always possible to optimize code because:

•  You might not have access to problematic code;
•  It demands too much effort or it is too risky to change it.
•  There is nothing you can do (I/O latency, etc…).
•  Other reasons ...
Can I postpone ?




loading Plug-Ins …
Can I postpone ?




            Loading
            plug-ins
Can I parallelize?
Can I parallelize?




Sending
 file…
Can I remove it ?
In conclusion …

•  You learned that libraries may play an important role in the startup
   performance of your application;
•  You saw how dynamic link works on Linux;
•  You were introduce to prelink and and became aware of its potential
   to boost the startup;
•  You learned how to load a shared object on demand, preventing
   that some them be a burden at startup;
•  You got some tips on how to write libraries to get the best
   performance;
•  You understood that an UI that provides quick user feedback is more
   important than performance;
Q&A

Contenu connexe

Tendances

Kotlin- Basic to Advance
Kotlin- Basic to Advance Kotlin- Basic to Advance
Kotlin- Basic to Advance Coder Tech
 
Detecting Occurrences of Refactoring with Heuristic Search
Detecting Occurrences of Refactoring with Heuristic SearchDetecting Occurrences of Refactoring with Heuristic Search
Detecting Occurrences of Refactoring with Heuristic SearchShinpei Hayashi
 
Objective-c for Java Developers
Objective-c for Java DevelopersObjective-c for Java Developers
Objective-c for Java DevelopersMuhammad Abdullah
 
WEB PROGRAMMING UNIT VI BY BHAVSINGH MALOTH
WEB PROGRAMMING UNIT VI BY BHAVSINGH MALOTHWEB PROGRAMMING UNIT VI BY BHAVSINGH MALOTH
WEB PROGRAMMING UNIT VI BY BHAVSINGH MALOTHBhavsingh Maloth
 
06 - ELF format, knowing your friend
06 - ELF format, knowing your friend06 - ELF format, knowing your friend
06 - ELF format, knowing your friendAlexandre Moneger
 
Compilation and Execution
Compilation and ExecutionCompilation and Execution
Compilation and ExecutionChong-Kuan Chen
 
Sentence-to-Code Traceability Recovery with Domain Ontologies
Sentence-to-Code Traceability Recovery with Domain OntologiesSentence-to-Code Traceability Recovery with Domain Ontologies
Sentence-to-Code Traceability Recovery with Domain OntologiesShinpei Hayashi
 
Inside PHP [OSCON 2012]
Inside PHP [OSCON 2012]Inside PHP [OSCON 2012]
Inside PHP [OSCON 2012]Tom Lee
 
MidwestPHP Symfony2 Internals
MidwestPHP Symfony2 InternalsMidwestPHP Symfony2 Internals
MidwestPHP Symfony2 InternalsRaul Fraile
 
WEB PROGRAMMING UNIT VIII BY BHAVSINGH MALOTH
WEB PROGRAMMING UNIT VIII BY BHAVSINGH MALOTHWEB PROGRAMMING UNIT VIII BY BHAVSINGH MALOTH
WEB PROGRAMMING UNIT VIII BY BHAVSINGH MALOTHBhavsingh Maloth
 
A hands-on introduction to the ELF Object file format
A hands-on introduction to the ELF Object file formatA hands-on introduction to the ELF Object file format
A hands-on introduction to the ELF Object file formatrety61
 
The essence of the VivaCore code analysis library
The essence of the VivaCore code analysis libraryThe essence of the VivaCore code analysis library
The essence of the VivaCore code analysis libraryPVS-Studio
 
Inside Python [OSCON 2012]
Inside Python [OSCON 2012]Inside Python [OSCON 2012]
Inside Python [OSCON 2012]Tom Lee
 
Your Own Metric System
Your Own Metric SystemYour Own Metric System
Your Own Metric SystemErin Dees
 
JDK8 Functional API
JDK8 Functional APIJDK8 Functional API
JDK8 Functional APIJustin Lin
 
Thnad's Revenge
Thnad's RevengeThnad's Revenge
Thnad's RevengeErin Dees
 
A(n abridged) tour of the Rust compiler [PDX-Rust March 2014]
A(n abridged) tour of the Rust compiler [PDX-Rust March 2014]A(n abridged) tour of the Rust compiler [PDX-Rust March 2014]
A(n abridged) tour of the Rust compiler [PDX-Rust March 2014]Tom Lee
 

Tendances (20)

Kotlin- Basic to Advance
Kotlin- Basic to Advance Kotlin- Basic to Advance
Kotlin- Basic to Advance
 
Detecting Occurrences of Refactoring with Heuristic Search
Detecting Occurrences of Refactoring with Heuristic SearchDetecting Occurrences of Refactoring with Heuristic Search
Detecting Occurrences of Refactoring with Heuristic Search
 
Assembler
AssemblerAssembler
Assembler
 
Objective-c for Java Developers
Objective-c for Java DevelopersObjective-c for Java Developers
Objective-c for Java Developers
 
Basics of building a blackfin application
Basics of building a blackfin applicationBasics of building a blackfin application
Basics of building a blackfin application
 
WEB PROGRAMMING UNIT VI BY BHAVSINGH MALOTH
WEB PROGRAMMING UNIT VI BY BHAVSINGH MALOTHWEB PROGRAMMING UNIT VI BY BHAVSINGH MALOTH
WEB PROGRAMMING UNIT VI BY BHAVSINGH MALOTH
 
06 - ELF format, knowing your friend
06 - ELF format, knowing your friend06 - ELF format, knowing your friend
06 - ELF format, knowing your friend
 
Compilation and Execution
Compilation and ExecutionCompilation and Execution
Compilation and Execution
 
Sentence-to-Code Traceability Recovery with Domain Ontologies
Sentence-to-Code Traceability Recovery with Domain OntologiesSentence-to-Code Traceability Recovery with Domain Ontologies
Sentence-to-Code Traceability Recovery with Domain Ontologies
 
Inside PHP [OSCON 2012]
Inside PHP [OSCON 2012]Inside PHP [OSCON 2012]
Inside PHP [OSCON 2012]
 
Python and You Series
Python and You SeriesPython and You Series
Python and You Series
 
MidwestPHP Symfony2 Internals
MidwestPHP Symfony2 InternalsMidwestPHP Symfony2 Internals
MidwestPHP Symfony2 Internals
 
WEB PROGRAMMING UNIT VIII BY BHAVSINGH MALOTH
WEB PROGRAMMING UNIT VIII BY BHAVSINGH MALOTHWEB PROGRAMMING UNIT VIII BY BHAVSINGH MALOTH
WEB PROGRAMMING UNIT VIII BY BHAVSINGH MALOTH
 
A hands-on introduction to the ELF Object file format
A hands-on introduction to the ELF Object file formatA hands-on introduction to the ELF Object file format
A hands-on introduction to the ELF Object file format
 
The essence of the VivaCore code analysis library
The essence of the VivaCore code analysis libraryThe essence of the VivaCore code analysis library
The essence of the VivaCore code analysis library
 
Inside Python [OSCON 2012]
Inside Python [OSCON 2012]Inside Python [OSCON 2012]
Inside Python [OSCON 2012]
 
Your Own Metric System
Your Own Metric SystemYour Own Metric System
Your Own Metric System
 
JDK8 Functional API
JDK8 Functional APIJDK8 Functional API
JDK8 Functional API
 
Thnad's Revenge
Thnad's RevengeThnad's Revenge
Thnad's Revenge
 
A(n abridged) tour of the Rust compiler [PDX-Rust March 2014]
A(n abridged) tour of the Rust compiler [PDX-Rust March 2014]A(n abridged) tour of the Rust compiler [PDX-Rust March 2014]
A(n abridged) tour of the Rust compiler [PDX-Rust March 2014]
 

Similaire à Strategies to improve embedded Linux application performance beyond ordinary techniques

Whirlwind tour of the Runtime Dynamic Linker
Whirlwind tour of the Runtime Dynamic LinkerWhirlwind tour of the Runtime Dynamic Linker
Whirlwind tour of the Runtime Dynamic LinkerGonçalo Gomes
 
How to write a shared library.pptx
How to write a shared library.pptxHow to write a shared library.pptx
How to write a shared library.pptxAviv Avitan
 
Exciting JavaScript - Part I
Exciting JavaScript - Part IExciting JavaScript - Part I
Exciting JavaScript - Part IEugene Lazutkin
 
Native hook mechanism in Android Bionic linker
Native hook mechanism in Android Bionic linkerNative hook mechanism in Android Bionic linker
Native hook mechanism in Android Bionic linkerKevin Mai-Hsuan Chia
 
嵌入式Linux課程-GNU Toolchain
嵌入式Linux課程-GNU Toolchain嵌入式Linux課程-GNU Toolchain
嵌入式Linux課程-GNU Toolchain艾鍗科技
 
The Scheme Language -- Using it on the iPhone
The Scheme Language -- Using it on the iPhoneThe Scheme Language -- Using it on the iPhone
The Scheme Language -- Using it on the iPhoneJames Long
 
DEF CON 27 - DIMITRY SNEZHKOV - zombie ant farm practical tips
DEF CON 27 - DIMITRY SNEZHKOV - zombie ant farm practical tipsDEF CON 27 - DIMITRY SNEZHKOV - zombie ant farm practical tips
DEF CON 27 - DIMITRY SNEZHKOV - zombie ant farm practical tipsFelipe Prado
 
Advanced c programming in Linux
Advanced c programming in Linux Advanced c programming in Linux
Advanced c programming in Linux Mohammad Golyani
 
[Defcon24] Introduction to the Witchcraft Compiler Collection
[Defcon24] Introduction to the Witchcraft Compiler Collection[Defcon24] Introduction to the Witchcraft Compiler Collection
[Defcon24] Introduction to the Witchcraft Compiler CollectionMoabi.com
 
PHP = PHunctional Programming
PHP = PHunctional ProgrammingPHP = PHunctional Programming
PHP = PHunctional ProgrammingLuis Atencio
 
Exciting JavaScript - Part II
Exciting JavaScript - Part IIExciting JavaScript - Part II
Exciting JavaScript - Part IIEugene Lazutkin
 
Post exploitation techniques on OSX and Iphone, EuSecWest 2009
Post exploitation techniques on OSX and Iphone, EuSecWest 2009Post exploitation techniques on OSX and Iphone, EuSecWest 2009
Post exploitation techniques on OSX and Iphone, EuSecWest 2009Vincenzo Iozzo
 
Understanding how C program works
Understanding how C program worksUnderstanding how C program works
Understanding how C program worksMindBridgeTech
 
From gcc to the autotools
From gcc to the autotoolsFrom gcc to the autotools
From gcc to the autotoolsThierry Gayet
 
Functional Programming #FTW
Functional Programming #FTWFunctional Programming #FTW
Functional Programming #FTWAdriano Bonat
 

Similaire à Strategies to improve embedded Linux application performance beyond ordinary techniques (20)

Whirlwind tour of the Runtime Dynamic Linker
Whirlwind tour of the Runtime Dynamic LinkerWhirlwind tour of the Runtime Dynamic Linker
Whirlwind tour of the Runtime Dynamic Linker
 
How to write a shared library.pptx
How to write a shared library.pptxHow to write a shared library.pptx
How to write a shared library.pptx
 
Exciting JavaScript - Part I
Exciting JavaScript - Part IExciting JavaScript - Part I
Exciting JavaScript - Part I
 
Native hook mechanism in Android Bionic linker
Native hook mechanism in Android Bionic linkerNative hook mechanism in Android Bionic linker
Native hook mechanism in Android Bionic linker
 
Linkers And Loaders
Linkers And LoadersLinkers And Loaders
Linkers And Loaders
 
嵌入式Linux課程-GNU Toolchain
嵌入式Linux課程-GNU Toolchain嵌入式Linux課程-GNU Toolchain
嵌入式Linux課程-GNU Toolchain
 
The Scheme Language -- Using it on the iPhone
The Scheme Language -- Using it on the iPhoneThe Scheme Language -- Using it on the iPhone
The Scheme Language -- Using it on the iPhone
 
DEF CON 27 - DIMITRY SNEZHKOV - zombie ant farm practical tips
DEF CON 27 - DIMITRY SNEZHKOV - zombie ant farm practical tipsDEF CON 27 - DIMITRY SNEZHKOV - zombie ant farm practical tips
DEF CON 27 - DIMITRY SNEZHKOV - zombie ant farm practical tips
 
Advanced c programming in Linux
Advanced c programming in Linux Advanced c programming in Linux
Advanced c programming in Linux
 
[Defcon24] Introduction to the Witchcraft Compiler Collection
[Defcon24] Introduction to the Witchcraft Compiler Collection[Defcon24] Introduction to the Witchcraft Compiler Collection
[Defcon24] Introduction to the Witchcraft Compiler Collection
 
Ch3 gnu make
Ch3 gnu makeCh3 gnu make
Ch3 gnu make
 
olibc: Another C Library optimized for Embedded Linux
olibc: Another C Library optimized for Embedded Linuxolibc: Another C Library optimized for Embedded Linux
olibc: Another C Library optimized for Embedded Linux
 
PHP = PHunctional Programming
PHP = PHunctional ProgrammingPHP = PHunctional Programming
PHP = PHunctional Programming
 
Exciting JavaScript - Part II
Exciting JavaScript - Part IIExciting JavaScript - Part II
Exciting JavaScript - Part II
 
Post exploitation techniques on OSX and Iphone, EuSecWest 2009
Post exploitation techniques on OSX and Iphone, EuSecWest 2009Post exploitation techniques on OSX and Iphone, EuSecWest 2009
Post exploitation techniques on OSX and Iphone, EuSecWest 2009
 
Understanding how C program works
Understanding how C program worksUnderstanding how C program works
Understanding how C program works
 
Libraries
LibrariesLibraries
Libraries
 
From gcc to the autotools
From gcc to the autotoolsFrom gcc to the autotools
From gcc to the autotools
 
Eusecwest
EusecwestEusecwest
Eusecwest
 
Functional Programming #FTW
Functional Programming #FTWFunctional Programming #FTW
Functional Programming #FTW
 

Dernier

Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Scott Andery
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationKnoldus Inc.
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI AgeCprime
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 

Dernier (20)

Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
 
Data governance with Unity Catalog Presentation
Data governance with Unity Catalog PresentationData governance with Unity Catalog Presentation
Data governance with Unity Catalog Presentation
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
A Framework for Development in the AI Age
A Framework for Development in the AI AgeA Framework for Development in the AI Age
A Framework for Development in the AI Age
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 

Strategies to improve embedded Linux application performance beyond ordinary techniques

  • 1. Strategies to improve embedded Linux applications’ performance beyond ordinary techniques Anderson Medeiros Software Engineer, Motorola André Oriani Software Engineer, Motorola
  • 2. Agenda •  The performance problem faced by Motorola’s IM team •  Linux’s Dynamic Loader •  Prelink •  Libraries Tools •  Dymically loading Libraries •  Tuning Shared Libraries •  UI Time Perception •  Q & A
  • 6. Our Discover User clicks fork() main() Screen.show() DYNAMIC LOADER t
  • 8. Loading a dynamically linked program .interp A Load dynamic linker .rel.text Relocation .rel.data .dynamic Libraries .init Dependency libraries Program’s Symbol entry point tables A
  • 9. A closer look at relocation Relative Symbol-based Type Lookup failed Symbol’s Compute hash Yes offset Lookup Hash Next No scope Add load bucket object empty address Yes Next Match element No No Adjust Chain Yes address empty
  • 12. How does prelink work? I •  Collects ELF binaries which should be prelinked and all the ELF shared libraries they depend on •  Assigns a unique virtual address space slot for each library and relinks the shared library to that base address •  Resolves all relocations in the binary or library against its dependant libraries and stores the relocations into the ELF object •  Stores a list of all dependant libraries together with their checksums into the binary or library •  For binaries, it also computes a list of conflicts and stores it into a special ELF section Note: Libraries shall be compiled with the GCC option -fPIC
  • 13. How does prelink work? II •  At runtime, the dynamic linker first checks if it is prelinked itself •  Just before starting an application, the dynamic linker checks if: •  There is a library list section created by prelink •  They are present in symbol search scope in the same order •  None have been modified since prelinking •  There aren’t any new shared libraries loaded either •  If all conditions are satisfied, prelinking is used: •  Dynamic linker processes the fixup section and skips all normal relocation handling •  If at least one condition fails: •  Dynamic linker continues with normal relocation processing in the executable and all shared libraries
  • 14. Results t
  • 16. How to use prelink? •  prelink –avf --ld-library-path=PATH --dynamic-linker=LDSO •  -a --all •  Prelink all binaries and dependant libraries found in directory hierarchies specified in /etc/prelink.conf •  -v --verbose •  Verbose mode. Print the virtual address slot assignment to libraries •  -f --force •  Force re-prelinking even for already prelinked objects for which no dependencies changed •  --ld-library-path=PATH •  Specify special LD_LIBRARY_PATH to be used when prelink queries dynamic linker about symbol resolution details •  --dynamic-linker=LDSO •  Specify alternate dynamic linker instead of the default
  • 19. Motivation II If there are any libraries you are going to use only on special occasions, it is better to load them when they are really needed.
  • 20. The Basics #include <dlfcn.h> void* dlopen ( const char* filename, int flags); void* dlsym ( void* handle, const char* symbol); char* dlerror (void); int dlclose (void* handle); #echo Although you don’t have to link against the library #echo you still have to link against libdl # #gcc main.cpp -ldl -o program
  • 21.
  • 22. Loading C++ Libraries C++ uses mangling! int mod (int a , int b); _Z3sumii float mod (float a, float b); _Z3sumff math.cpp math.o
  • 23. The example class Foo { public: Foo(){} ~Foo(){} void bar(const char * msg) { std::cout<<"Msg:"<<msg<<std::endl; } };
  • 24. The solution Step 1 Define an interface for your class. Foo + Foo() + ~Foo() + void bar(const char*)
  • 25. The solution Step 1 Define an interface for your class. <<interface>> Foo + virtual void bar(const char*) = 0 FooImpl + Foo() + ~Foo() + void bar(const char*)
  • 26. The solution - Lib’s Header file Step 1 Define an interface for your class #ifndef FOO_H__ #define FOO_H__ class Foo { public: virtual void bar (const char*) = 0; };
  • 27. The solution - Lib’s Header file Step 2 Create “C functions” to create and destroy instances of your class Step 3 You might want to create typedefs extern "C" Foo* createFoo(); extern "C" void destroyFoo(Foo*); typedef Foo* (*createFoo_t) (); typedef void (*destroyFoo_t)(Foo*); #endif
  • 28. The solution - Lib’s Implementation file Step 4 Implement your interface and “C functions” #include "foo.h" Foo* createFoo() #include <iostream.h> { return new FooImpl(); class FooImpl:public Foo } { public: void destroyFoo(Foo* foo) FooImpl(){} { virtual ~FooImpl(){} FooImpl* fooImpl = virtual void bar(const char * msg) static_cast<FooImpl*>(foo); { delete fooImpl; cout<<"Msg: "<<msg<<endl; } } };
  • 29. The solution - The program #include <foo.h> #include <assert.h> #include <dlfcn.h> int main() { void* handle = dlopen("./libfoo.so",RTLD_LAZY); assert(handle); createFoo_t dyn_createFoo = (createFoo_t)dlsym(handle,"createFoo"); assert(!dlerror()); Foo* foo = dyn_createFoo(); if(foo) foo->bar("The method bar is being called"); destroyFoo_t dyn_destroyFoo = (destroyFoo_t)dlsym(handle,"destroyFoo"); assert(!dlerror()); dyn_destroyFoo(foo); dlclose(handle); return 0; }
  • 31. Inspiration “How To Write Shared Libraries” Ulrich Drepper- Red Hat http://people.redhat.com/drepper/dsohowto.pdf
  • 32. Less is always better Keep at minimum… •  The number of libraries you directly or indirectly depend •  The size of libraries you link against shall have the smallest size possible •  The number for search directories for libraries, ideally one directory •  The number of exported symbols •  The length of symbols strings •  The numbers of relocations
  • 34. Reducing search space Step 1 Set LD_LIBRARY_PATH to empty Step 2 When linking use the options: -rpath-link <dir> to the specify your system’s directory for libraries -z nodeflib to avoid searching on /lib, /usr/lib and others places specified by /etc/ld.so.conf and /etc/ld.so.cache #export LD_LIBRARY_PATH=“” #gcc main.cpp -Wl,-z,nodeflib -Wl,-rpath-link,/lib -lfoo -o program
  • 35. Reducing exported symbols Using GCC’s attribute feature int localVar __attribute__((visibility(“hidden”))); int localFunction() __attribute__((visibility(“hidden”))); class Someclass { private: static int a __attribute__((visibility(“hidden”))); int b; int doSomething(int d)__attribute__((visibility (“hidden”))); public: Someclass(int c); int doSomethingImportant(); };
  • 36. Reducing exported symbols II { You can tell the linker which global: symbols shall be exported cFunction*; using export maps extern “C++” { cppFunction*; *Someclass; Someclass::Someclass*; #g++ -shared example.cpp -o Someclass::?Someclass*; libexample.so.1 -Wl, Someclass::method* -soname=libexample.so.1 -Wl,- }; -version-script=example.map local: *; };
  • 37. Pro and Cons Pros Cons Visibility attribute Visibility attribute •  Compiler can generate optimal •  GCC’s specific feature; code; •  Code become less readable; Export Maps Export Maps •  More practical; •  No optimization can be done by •  Centralizes the definition of library’s compiler because any symbol may API; be exported
  • 38. Restricting symbol string’s lenght namespace java { namespace lang { class Math { static const int PI; static double sin(double d); static double cos(double d); static double FastFourierTransform (double a, int b,const int** const c); }; _ZN4java4lang4Math2PIE } _ZN4java4lang4Math3sinEd } _ZN4java4lang4Math3cosEd _ZN4java4lang4Math20FastFourierTransformEdiPPKi
  • 39. Avoiding relocations char* a = “ABC”; A B C 0 .data const char a[] = “ABC”; A B C 0 .rodata ELF
  • 41. Motivation X hours to deliver X hours to deliver $ to ship $ to ship Package tracking No tracking
  • 43. Improving responsiveness It is not always possible to optimize code because: •  You might not have access to problematic code; •  It demands too much effort or it is too risky to change it. •  There is nothing you can do (I/O latency, etc…). •  Other reasons ...
  • 44. Can I postpone ? loading Plug-Ins …
  • 45. Can I postpone ? Loading plug-ins
  • 48. Can I remove it ?
  • 49. In conclusion … •  You learned that libraries may play an important role in the startup performance of your application; •  You saw how dynamic link works on Linux; •  You were introduce to prelink and and became aware of its potential to boost the startup; •  You learned how to load a shared object on demand, preventing that some them be a burden at startup; •  You got some tips on how to write libraries to get the best performance; •  You understood that an UI that provides quick user feedback is more important than performance;
  • 50. Q&A