Slide 1

Slide 1 text

STATIC VS. Dynamic LINKING DOTSWIFT 2015, MARIUS RACKWITZ, @MRACKWITZ 1

Slide 2

Slide 2 text

LIBRARIES VS. FRAMEWORKS 2

Slide 3

Slide 3 text

❓ 3

Slide 4

Slide 4 text

PERSPECTIVE CLARIFICATION 4

Slide 5

Slide 5 text

ARCHITECTURAL PERSPECTIVE: Hollywood PRINCIPLE 5

Slide 6

Slide 6 text

DON'T CALL us, WE'LL CALL you! 6

Slide 7

Slide 7 text

7

Slide 8

Slide 8 text

TOOLING PERSPECTIVE: DIFFERENT BUILD PRODUCTS 8

Slide 9

Slide 9 text

A STATIC LIBRARY (AKA STATIC ARCHIVE) … is a collection of .o files with a table of contents that lists the global symbols in the .o files. — the man page of ld 9

Slide 10

Slide 10 text

10

Slide 11

Slide 11 text

BUILDING A STATIC LIBRARY $ xcodebuild -target BananaLib … MACH_O_TYPE=staticlib # Pseudo (⾠) Code of what happens under the hood: PRODUCT_PATHS='' for ARCH in $ARCHS do OBJECT_FILES='' for FILE in $SRC_FILES do FILE_BASENAME=$(basename $FILE) OBJECT_FILE="$OBJECT_FILE_DIR_normal/$ARCH/$FILE_BASENAME.o" clang … -c $FILE -o $OBJECT_FILE OBJECT_FILES="$OUTPUT_FILES $OBJECT_FILE" end PRODUCT_PATH="$OBJECT_FILE_DIR_normal/$ARCH/$PRODUCT_NAME.a" ranlib $PRODUCT_PATH - $OBJECT_FILES PRODUCT_PATHS="$PRODUCT_PATHS $PRODUCT_PATH" end lipo -create $PRODUCT_PATHS -output $CONFIGURATION_BUILD_DIR/$PRODUCT_NAME.a 11

Slide 12

Slide 12 text

STATIC LIBS ON LINK TIME ld will only pull .o files out of a static library if needed to resolve some symbol reference. — the man page of ld 12

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

14

Slide 15

Slide 15 text

FRAMEWORK 15

Slide 16

Slide 16 text

STATIC FRAMEWORK $ xcodebuild -target BananaFramework … MACH_O_TYPE=staticlib … # Build the static library mkdir $PRODUCT_NAME.framework mv $PRODUCT_NAME.a $PRODUCT_NAME.framework/$PRODUCT_NAME 16

Slide 17

Slide 17 text

⾠ CLASSES OF STATIC FRAMEWORKS ARE PART OF THE MAIN BUNDLE 17

Slide 18

Slide 18 text

A DYNAMIC LIBRARY (AKA DYLIB OR FRAMEWORK) … is a final linked image. — the man page of ld 18

Slide 19

Slide 19 text

19

Slide 20

Slide 20 text

DYNAMIC LIBRARY $ xcodebuild -target BananaLib … MACH_O_TYPE=mh_dylib PRODUCT_PATHS='' for ARCH in $ARCHS do … # Build $OBJECT_FILES PRODUCT_PATH="$OBJECT_FILE_DIR_normal/$ARCH/$PRODUCT_NAME.dylib" ld $OBJECT_FILES -o $PRODUCT_PATH -framework Foundation … PRODUCT_PATHS="$PRODUCT_PATHS $PRODUCT_PATH" end lipo -create $PRODUCT_PATHS -output $CONFIGURATION_BUILD_DIR/$PRODUCT_NAME.dylib 20

Slide 21

Slide 21 text

DYNAMIC FRAMEWORK $ xcodebuild -target BananaFramework … MACH_O_TYPE=mh_dylib … # Build the dylib mkdir $PRODUCT_NAME.framework mv $PRODUCT_NAME.dylib $PRODUCT_NAME.framework/$PRODUCT_NAME 21

Slide 22

Slide 22 text

DYLIBS ON LINK TIME Exported symbols from the dynamic library are used to resolve references. — the man page of ld 22

Slide 23

Slide 23 text

23

Slide 24

Slide 24 text

24

Slide 25

Slide 25 text

25

Slide 26

Slide 26 text

26

Slide 27

Slide 27 text

27

Slide 28

Slide 28 text

28

Slide 29

Slide 29 text

29

Slide 30

Slide 30 text

30

Slide 31

Slide 31 text

DYLIBS ON LINK TIME The generated final linked image will have encoded that it depends on that dynamic library. — the man page of ld 31

Slide 32

Slide 32 text

MACH-O FILE FORMAT BASIC STRUCTURE SOURCE: OS X ABI MACH-O FILE FORMAT REFERENCE 32

Slide 33

Slide 33 text

$ otool -l BananaKit.framework/BananaKit BananaKit.framework/BananaKit: … Load command 3 cmd LC_ID_DYLIB cmdsize 96 name @rpath/BananaKit.framework/BananaKit (offset 24) time stamp 1 Thu Jan 1 01:00:01 1970 current version 1.0.0 compatibility version 1.0.0 … Load command 9 cmd LC_LOAD_DYLIB cmdsize 56 name @rpath/libswiftCore.dylib (offset 24) time stamp 2 Wed Dec 31 16:00:02 1969 current version 0.0.0 compatibility version 0.0.0 … Load command 22 cmd LC_RPATH cmdsize 40 path @executable_path/Frameworks (offset 12) Load command 23 cmd LC_RPATH cmdsize 40 path @loader_path/Frameworks (offset 12) … 33

Slide 34

Slide 34 text

MACH-O LOAD COMMANDS ▸ LC_LOAD_DYLIB (OTHER_LD_FLAGS -l/-framework) ▸ LC_ID_DYLIB LD_DYLIB_INSTALL_NAME ▸ LC_RPATH LD_RUNPATH_SEARCH_PATHS 34

Slide 35

Slide 35 text

@rpath? ▸ Should be used as prefix in LC_ID_DYLIB / LC_LOAD_DYLIB ▸ Searched by dyld at runtime. 35

Slide 36

Slide 36 text

WRAP UP 36

Slide 37

Slide 37 text

ADVANTAGES OF DYNAMIC FRAMEWORKS ▸ Easier to distribute & integrate if compiled ▸ Encoded Dependencies ▸ Two-Level Namespacing ▸ Reduces file size if used for app & extensions ▸ Separate resources in distinct bundles 37

Slide 38

Slide 38 text

ADVANTAGES OF DYNAMIC FRAMEWORKS ▸ Easier to distribute & integrate if compiled ▸ Encoded Dependencies ▸ Two-Level Namespacing ▸ Reduces file size if used for app & extensions ▸ Separate resources in distinct bundles 38

Slide 39

Slide 39 text

DISADVANTAGES OF DYNAMIC LINKING ▸ Limits dead-code stripping ▸ Increases load times 39

Slide 40

Slide 40 text

RESTRICTIONS ▸ Dynamic Frameworks are needed for @IBDesignable. ▸ Dynamic Linking is needed for Swift. 40

Slide 41

Slide 41 text

WHEN ALTERING BUILD SETTINGS ACROSS TARGETS CLEAN WON'T DO THE JOB! 41

Slide 42

Slide 42 text

GOLDEN RULE #1 WHEN ALTERING BUILD SETTINGS ACROSS TARGETS NUKE DERIVEDDATA ! 42

Slide 43

Slide 43 text

GOLDEN RULE #1 WHEN ALTERING BUILD SETTINGS ACROSS TARGETS Always NUKE DERIVEDDATA ! 43

Slide 44

Slide 44 text

THANKS FOR YOUR ATTENTION! @MRACKWITZ [email protected] 44

Slide 45

Slide 45 text

for question in questions { question.ask()! } 45