MinElf.smali

.class public final Lcom/facebook/soloader/MinElf;
.super Ljava/lang/Object;
.source "SourceFile"


# annotations
.annotation system Ldalvik/annotation/MemberClasses;
    value = {
        Lcom/facebook/soloader/MinElf$ElfError;,
        Lcom/facebook/soloader/MinElf$ISA;
    }
.end annotation


# static fields
.field public static final DT_NEEDED:I = 0x1

.field public static final DT_NULL:I = 0x0

.field public static final DT_STRTAB:I = 0x5

.field public static final ELF_MAGIC:I = 0x464c457f

.field public static final PN_XNUM:I = 0xffff

.field public static final PT_DYNAMIC:I = 0x2

.field public static final PT_LOAD:I = 0x1

.field private static final TAG:Ljava/lang/String; = "MinElf"


# direct methods
.method public constructor <init>()V
    .registers 1

    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    return-void
.end method

.method public static extract_DT_NEEDED(Lcom/facebook/soloader/ElfByteChannel;)[Ljava/lang/String;
    .registers 2
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation

    .line 5
    instance-of v0, p0, Lcom/facebook/soloader/ElfFileChannel;

    if-eqz v0, :cond_b

    .line 6
    check-cast p0, Lcom/facebook/soloader/ElfFileChannel;

    invoke-static {p0}, Lcom/facebook/soloader/MinElf;->extract_DT_NEEDED_with_retries(Lcom/facebook/soloader/ElfFileChannel;)[Ljava/lang/String;

    move-result-object p0

    return-object p0

    .line 7
    :cond_b
    invoke-static {p0}, Lcom/facebook/soloader/MinElf;->extract_DT_NEEDED_no_retries(Lcom/facebook/soloader/ElfByteChannel;)[Ljava/lang/String;

    move-result-object p0

    return-object p0
.end method

.method public static extract_DT_NEEDED(Ljava/io/File;)[Ljava/lang/String;
    .registers 2
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation

    .line 1
    new-instance v0, Lcom/facebook/soloader/ElfFileChannel;

    invoke-direct {v0, p0}, Lcom/facebook/soloader/ElfFileChannel;-><init>(Ljava/io/File;)V

    .line 2
    :try_start_5
    invoke-static {v0}, Lcom/facebook/soloader/MinElf;->extract_DT_NEEDED(Lcom/facebook/soloader/ElfByteChannel;)[Ljava/lang/String;

    move-result-object p0
    :try_end_9
    .catchall {:try_start_5 .. :try_end_9} :catchall_d

    .line 3
    invoke-virtual {v0}, Lcom/facebook/soloader/ElfFileChannel;->close()V

    return-object p0

    :catchall_d
    move-exception p0

    .line 4
    :try_start_e
    invoke-virtual {v0}, Lcom/facebook/soloader/ElfFileChannel;->close()V
    :try_end_11
    .catchall {:try_start_e .. :try_end_11} :catchall_12

    goto :goto_16

    :catchall_12
    move-exception v0

    invoke-virtual {p0, v0}, Ljava/lang/Throwable;->addSuppressed(Ljava/lang/Throwable;)V

    :goto_16
    throw p0
.end method

.method private static extract_DT_NEEDED_no_retries(Lcom/facebook/soloader/ElfByteChannel;)[Ljava/lang/String;
    .registers 28
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation

    move-object/from16 v0, p0

    const/16 v1, 0x8

    .line 1
    invoke-static {v1}, Ljava/nio/ByteBuffer;->allocate(I)Ljava/nio/ByteBuffer;

    move-result-object v1

    .line 2
    sget-object v2, Ljava/nio/ByteOrder;->LITTLE_ENDIAN:Ljava/nio/ByteOrder;

    invoke-virtual {v1, v2}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;

    const-wide/16 v2, 0x0

    .line 3
    invoke-static {v0, v1, v2, v3}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v2

    const-wide/32 v4, 0x464c457f

    cmp-long v6, v2, v4

    if-nez v6, :cond_205

    const-wide/16 v2, 0x4

    .line 4
    invoke-static {v0, v1, v2, v3}, Lcom/facebook/soloader/MinElf;->getu8(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)S

    move-result v2

    const/4 v3, 0x1

    if-ne v2, v3, :cond_24

    goto :goto_25

    :cond_24
    const/4 v3, 0x0

    :goto_25
    const-wide/16 v4, 0x5

    .line 5
    invoke-static {v0, v1, v4, v5}, Lcom/facebook/soloader/MinElf;->getu8(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)S

    move-result v2

    const/4 v4, 0x2

    if-ne v2, v4, :cond_33

    .line 6
    sget-object v2, Ljava/nio/ByteOrder;->BIG_ENDIAN:Ljava/nio/ByteOrder;

    invoke-virtual {v1, v2}, Ljava/nio/ByteBuffer;->order(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;

    :cond_33
    const-wide/16 v4, 0x1c

    const-wide/16 v6, 0x20

    if-eqz v3, :cond_3e

    .line 7
    invoke-static {v0, v1, v4, v5}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v8

    goto :goto_42

    :cond_3e
    invoke-static {v0, v1, v6, v7}, Lcom/facebook/soloader/MinElf;->get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v8

    :goto_42
    const-wide/16 v10, 0x2c

    if-eqz v3, :cond_47

    goto :goto_49

    :cond_47
    const-wide/16 v10, 0x38

    .line 8
    :goto_49
    invoke-static {v0, v1, v10, v11}, Lcom/facebook/soloader/MinElf;->getu16(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)I

    move-result v2

    int-to-long v10, v2

    if-eqz v3, :cond_53

    const-wide/16 v12, 0x2a

    goto :goto_55

    :cond_53
    const-wide/16 v12, 0x36

    .line 9
    :goto_55
    invoke-static {v0, v1, v12, v13}, Lcom/facebook/soloader/MinElf;->getu16(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)I

    move-result v2

    const-wide/32 v12, 0xffff

    const-wide/16 v14, 0x28

    cmp-long v16, v10, v12

    if-nez v16, :cond_7d

    if-eqz v3, :cond_69

    .line 10
    invoke-static {v0, v1, v6, v7}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v6

    goto :goto_6d

    :cond_69
    invoke-static {v0, v1, v14, v15}, Lcom/facebook/soloader/MinElf;->get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v6

    :goto_6d
    if-eqz v3, :cond_75

    add-long/2addr v6, v4

    .line 11
    invoke-static {v0, v1, v6, v7}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v4

    goto :goto_7c

    :cond_75
    const-wide/16 v4, 0x2c

    add-long/2addr v6, v4

    .line 12
    invoke-static {v0, v1, v6, v7}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v4

    :goto_7c
    move-wide v10, v4

    :cond_7d
    const-wide/16 v4, 0x0

    move-wide v6, v8

    :goto_80
    const-wide/16 v14, 0x8

    cmp-long v16, v4, v10

    if-gez v16, :cond_b4

    if-eqz v3, :cond_91

    const-wide/16 v16, 0x0

    add-long v12, v6, v16

    .line 13
    invoke-static {v0, v1, v12, v13}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v12

    goto :goto_98

    :cond_91
    const-wide/16 v12, 0x0

    add-long/2addr v12, v6

    .line 14
    invoke-static {v0, v1, v12, v13}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v12

    :goto_98
    const-wide/16 v16, 0x2

    cmp-long v20, v12, v16

    if-nez v20, :cond_ae

    if-eqz v3, :cond_a8

    const-wide/16 v4, 0x4

    add-long/2addr v6, v4

    .line 15
    invoke-static {v0, v1, v6, v7}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v4

    goto :goto_b6

    :cond_a8
    add-long/2addr v6, v14

    .line 16
    invoke-static {v0, v1, v6, v7}, Lcom/facebook/soloader/MinElf;->get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v4

    goto :goto_b6

    :cond_ae
    int-to-long v12, v2

    add-long/2addr v6, v12

    const-wide/16 v12, 0x1

    add-long/2addr v4, v12

    goto :goto_80

    :cond_b4
    const-wide/16 v4, 0x0

    :goto_b6
    const-wide/16 v6, 0x0

    cmp-long v12, v4, v6

    if-eqz v12, :cond_1fd

    const/4 v12, 0x0

    move-wide/from16 v20, v4

    move-wide v12, v6

    const/4 v14, 0x0

    :goto_c1
    if-eqz v3, :cond_ca

    add-long v6, v20, v6

    .line 17
    invoke-static {v0, v1, v6, v7}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v6

    goto :goto_d0

    :cond_ca
    add-long v6, v20, v6

    invoke-static {v0, v1, v6, v7}, Lcom/facebook/soloader/MinElf;->get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v6

    :goto_d0
    const-string v15, "malformed DT_NEEDED section"

    const-wide/16 v18, 0x1

    cmp-long v22, v6, v18

    if-nez v22, :cond_e8

    move-wide/from16 v22, v4

    const v4, 0x7fffffff

    if-eq v14, v4, :cond_e2

    add-int/lit8 v14, v14, 0x1

    goto :goto_104

    .line 18
    :cond_e2
    new-instance v0, Lcom/facebook/soloader/MinElf$ElfError;

    invoke-direct {v0, v15}, Lcom/facebook/soloader/MinElf$ElfError;-><init>(Ljava/lang/String;)V

    throw v0

    :cond_e8
    move-wide/from16 v22, v4

    const-wide/16 v4, 0x5

    cmp-long v24, v6, v4

    if-nez v24, :cond_104

    if-eqz v3, :cond_fb

    const-wide/16 v4, 0x4

    add-long v4, v20, v4

    .line 19
    invoke-static {v0, v1, v4, v5}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v4

    goto :goto_103

    :cond_fb
    const-wide/16 v4, 0x8

    add-long v12, v20, v4

    invoke-static {v0, v1, v12, v13}, Lcom/facebook/soloader/MinElf;->get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v4

    :goto_103
    move-wide v12, v4

    :cond_104
    :goto_104
    const-wide/16 v4, 0x10

    if-eqz v3, :cond_10b

    const-wide/16 v24, 0x8

    goto :goto_10d

    :cond_10b
    move-wide/from16 v24, v4

    :goto_10d
    add-long v20, v20, v24

    const-wide/16 v24, 0x0

    cmp-long v26, v6, v24

    if-nez v26, :cond_1f3

    cmp-long v6, v12, v24

    if-eqz v6, :cond_1eb

    const/4 v6, 0x0

    move/from16 v26, v14

    move-object v7, v15

    :goto_11d
    int-to-long v14, v6

    cmp-long v20, v14, v10

    if-gez v20, :cond_17e

    if-eqz v3, :cond_12b

    add-long v14, v8, v24

    .line 20
    invoke-static {v0, v1, v14, v15}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v14

    goto :goto_131

    :cond_12b
    add-long v14, v8, v24

    .line 21
    invoke-static {v0, v1, v14, v15}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v14

    :goto_131
    const-wide/16 v18, 0x1

    cmp-long v20, v14, v18

    if-nez v20, :cond_175

    if-eqz v3, :cond_142

    const-wide/16 v14, 0x8

    add-long v4, v8, v14

    .line 22
    invoke-static {v0, v1, v4, v5}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v4

    goto :goto_147

    :cond_142
    add-long/2addr v4, v8

    .line 23
    invoke-static {v0, v1, v4, v5}, Lcom/facebook/soloader/MinElf;->get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v4

    :goto_147
    if-eqz v3, :cond_151

    const-wide/16 v14, 0x14

    add-long/2addr v14, v8

    .line 24
    invoke-static {v0, v1, v14, v15}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v14

    goto :goto_158

    :cond_151
    const-wide/16 v14, 0x28

    add-long/2addr v14, v8

    .line 25
    invoke-static {v0, v1, v14, v15}, Lcom/facebook/soloader/MinElf;->get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v14

    :goto_158
    cmp-long v20, v4, v12

    if-gtz v20, :cond_175

    add-long/2addr v14, v4

    cmp-long v20, v12, v14

    if-gez v20, :cond_175

    if-eqz v3, :cond_16b

    const-wide/16 v10, 0x4

    add-long/2addr v8, v10

    .line 26
    invoke-static {v0, v1, v8, v9}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v8

    goto :goto_172

    :cond_16b
    const-wide/16 v10, 0x8

    add-long/2addr v8, v10

    .line 27
    invoke-static {v0, v1, v8, v9}, Lcom/facebook/soloader/MinElf;->get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v8

    :goto_172
    sub-long/2addr v12, v4

    add-long/2addr v12, v8

    goto :goto_180

    :cond_175
    int-to-long v4, v2

    add-long/2addr v8, v4

    add-int/lit8 v6, v6, 0x1

    const-wide/16 v4, 0x10

    const-wide/16 v24, 0x0

    goto :goto_11d

    :cond_17e
    const-wide/16 v12, 0x0

    :goto_180
    const-wide/16 v4, 0x0

    cmp-long v2, v12, v4

    if-eqz v2, :cond_1e3

    move/from16 v14, v26

    .line 28
    new-array v2, v14, [Ljava/lang/String;

    const/4 v6, 0x0

    move-wide v8, v4

    move-wide/from16 v4, v22

    :goto_18e
    add-long/2addr v8, v4

    if-eqz v3, :cond_196

    .line 29
    invoke-static {v0, v1, v8, v9}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v8

    goto :goto_19a

    :cond_196
    invoke-static {v0, v1, v8, v9}, Lcom/facebook/soloader/MinElf;->get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v8

    :goto_19a
    const-wide/16 v18, 0x1

    cmp-long v10, v8, v18

    if-nez v10, :cond_1c9

    const-wide/16 v10, 0x4

    if-eqz v3, :cond_1ac

    add-long/2addr v10, v4

    .line 30
    invoke-static {v0, v1, v10, v11}, Lcom/facebook/soloader/MinElf;->getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v10

    const-wide/16 v15, 0x8

    goto :goto_1b4

    :cond_1ac
    const-wide/16 v15, 0x8

    add-long v10, v4, v15

    invoke-static {v0, v1, v10, v11}, Lcom/facebook/soloader/MinElf;->get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J

    move-result-wide v10

    :goto_1b4
    add-long/2addr v10, v12

    .line 31
    invoke-static {v0, v1, v10, v11}, Lcom/facebook/soloader/MinElf;->getSz(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)Ljava/lang/String;

    move-result-object v10

    aput-object v10, v2, v6

    const v10, 0x7fffffff

    if-eq v6, v10, :cond_1c3

    add-int/lit8 v6, v6, 0x1

    goto :goto_1cb

    .line 32
    :cond_1c3
    new-instance v0, Lcom/facebook/soloader/MinElf$ElfError;

    invoke-direct {v0, v7}, Lcom/facebook/soloader/MinElf$ElfError;-><init>(Ljava/lang/String;)V

    throw v0

    :cond_1c9
    const-wide/16 v15, 0x8

    :goto_1cb
    if-eqz v3, :cond_1cf

    move-wide v10, v15

    goto :goto_1d1

    :cond_1cf
    const-wide/16 v10, 0x10

    :goto_1d1
    add-long/2addr v4, v10

    const-wide/16 v10, 0x0

    cmp-long v17, v8, v10

    if-nez v17, :cond_1e1

    if-ne v6, v14, :cond_1db

    return-object v2

    .line 33
    :cond_1db
    new-instance v0, Lcom/facebook/soloader/MinElf$ElfError;

    invoke-direct {v0, v7}, Lcom/facebook/soloader/MinElf$ElfError;-><init>(Ljava/lang/String;)V

    throw v0

    :cond_1e1
    move-wide v8, v10

    goto :goto_18e

    .line 34
    :cond_1e3
    new-instance v0, Lcom/facebook/soloader/MinElf$ElfError;

    const-string v1, "did not find file offset of DT_STRTAB table"

    invoke-direct {v0, v1}, Lcom/facebook/soloader/MinElf$ElfError;-><init>(Ljava/lang/String;)V

    throw v0

    .line 35
    :cond_1eb
    new-instance v0, Lcom/facebook/soloader/MinElf$ElfError;

    const-string v1, "Dynamic section string-table not found"

    invoke-direct {v0, v1}, Lcom/facebook/soloader/MinElf$ElfError;-><init>(Ljava/lang/String;)V

    throw v0

    :cond_1f3
    const-wide/16 v15, 0x8

    const-wide/16 v18, 0x1

    move-wide/from16 v4, v22

    move-wide/from16 v6, v24

    goto/16 :goto_c1

    .line 36
    :cond_1fd
    new-instance v0, Lcom/facebook/soloader/MinElf$ElfError;

    const-string v1, "ELF file does not contain dynamic linking information"

    invoke-direct {v0, v1}, Lcom/facebook/soloader/MinElf$ElfError;-><init>(Ljava/lang/String;)V

    throw v0

    .line 37
    :cond_205
    new-instance v0, Lcom/facebook/soloader/MinElf$ElfError;

    const-string v1, "file is not ELF: 0x"

    .line 38
    invoke-static {v1}, Landroid/support/v4/media/c;->c(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    .line 39
    invoke-static {v2, v3}, Ljava/lang/Long;->toHexString(J)Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-direct {v0, v1}, Lcom/facebook/soloader/MinElf$ElfError;-><init>(Ljava/lang/String;)V

    throw v0
.end method

.method private static extract_DT_NEEDED_with_retries(Lcom/facebook/soloader/ElfFileChannel;)[Ljava/lang/String;
    .registers 4
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation

    const/4 v0, 0x0

    .line 1
    :goto_1
    :try_start_1
    invoke-static {p0}, Lcom/facebook/soloader/MinElf;->extract_DT_NEEDED_no_retries(Lcom/facebook/soloader/ElfByteChannel;)[Ljava/lang/String;

    move-result-object p0
    :try_end_5
    .catch Ljava/nio/channels/ClosedByInterruptException; {:try_start_1 .. :try_end_5} :catch_6

    return-object p0

    :catch_6
    move-exception v1

    add-int/lit8 v0, v0, 0x1

    const/4 v2, 0x4

    if-gt v0, v2, :cond_13

    .line 2
    invoke-static {}, Ljava/lang/Thread;->interrupted()Z

    .line 3
    invoke-virtual {p0}, Lcom/facebook/soloader/ElfFileChannel;->openChannel()V

    goto :goto_1

    .line 4
    :cond_13
    throw v1
.end method

.method private static get64(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J
    .registers 5
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation

    const/16 v0, 0x8

    .line 1
    invoke-static {p0, p1, v0, p2, p3}, Lcom/facebook/soloader/MinElf;->read(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;IJ)V

    .line 2
    invoke-virtual {p1}, Ljava/nio/ByteBuffer;->getLong()J

    move-result-wide p0

    return-wide p0
.end method

.method private static getSz(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)Ljava/lang/String;
    .registers 7
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation

    .line 1
    new-instance v0, Ljava/lang/StringBuilder;

    invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V

    :goto_5
    const-wide/16 v1, 0x1

    add-long/2addr v1, p2

    .line 2
    invoke-static {p0, p1, p2, p3}, Lcom/facebook/soloader/MinElf;->getu8(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)S

    move-result p2

    if-eqz p2, :cond_14

    int-to-char p2, p2

    .line 3
    invoke-virtual {v0, p2}, Ljava/lang/StringBuilder;->append(C)Ljava/lang/StringBuilder;

    move-wide p2, v1

    goto :goto_5

    .line 4
    :cond_14
    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object p0

    return-object p0
.end method

.method private static getu16(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)I
    .registers 5
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation

    const/4 v0, 0x2

    .line 1
    invoke-static {p0, p1, v0, p2, p3}, Lcom/facebook/soloader/MinElf;->read(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;IJ)V

    .line 2
    invoke-virtual {p1}, Ljava/nio/ByteBuffer;->getShort()S

    move-result p0

    const p1, 0xffff

    and-int/2addr p0, p1

    return p0
.end method

.method private static getu32(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)J
    .registers 5
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation

    const/4 v0, 0x4

    .line 1
    invoke-static {p0, p1, v0, p2, p3}, Lcom/facebook/soloader/MinElf;->read(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;IJ)V

    .line 2
    invoke-virtual {p1}, Ljava/nio/ByteBuffer;->getInt()I

    move-result p0

    int-to-long p0, p0

    const-wide p2, 0xffffffffL

    and-long/2addr p0, p2

    return-wide p0
.end method

.method private static getu8(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;J)S
    .registers 5
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation

    const/4 v0, 0x1

    .line 1
    invoke-static {p0, p1, v0, p2, p3}, Lcom/facebook/soloader/MinElf;->read(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;IJ)V

    .line 2
    invoke-virtual {p1}, Ljava/nio/ByteBuffer;->get()B

    move-result p0

    and-int/lit16 p0, p0, 0xff

    int-to-short p0, p0

    return p0
.end method

.method private static read(Lcom/facebook/soloader/ElfByteChannel;Ljava/nio/ByteBuffer;IJ)V
    .registers 8
    .annotation system Ldalvik/annotation/Throws;
        value = {
            Ljava/io/IOException;
        }
    .end annotation

    const/4 v0, 0x0

    .line 1
    invoke-virtual {p1, v0}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;

    .line 2
    invoke-virtual {p1, p2}, Ljava/nio/ByteBuffer;->limit(I)Ljava/nio/Buffer;

    .line 3
    :goto_7
    invoke-virtual {p1}, Ljava/nio/Buffer;->remaining()I

    move-result p2

    if-lez p2, :cond_18

    .line 4
    invoke-interface {p0, p1, p3, p4}, Lcom/facebook/soloader/ElfByteChannel;->read(Ljava/nio/ByteBuffer;J)I

    move-result p2

    const/4 v1, -0x1

    if-ne p2, v1, :cond_15

    goto :goto_18

    :cond_15
    int-to-long v1, p2

    add-long/2addr p3, v1

    goto :goto_7

    .line 5
    :cond_18
    :goto_18
    invoke-virtual {p1}, Ljava/nio/Buffer;->remaining()I

    move-result p0

    if-gtz p0, :cond_22

    .line 6
    invoke-virtual {p1, v0}, Ljava/nio/ByteBuffer;->position(I)Ljava/nio/Buffer;

    return-void

    .line 7
    :cond_22
    new-instance p0, Lcom/facebook/soloader/MinElf$ElfError;

    const-string p1, "ELF file truncated"

    invoke-direct {p0, p1}, Lcom/facebook/soloader/MinElf$ElfError;-><init>(Ljava/lang/String;)V

    throw p0
.end method