/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */

int * dlopen(int param_1,uint param_2)

{
  bool bVar1;
  char *pcVar2;
  int iVar3;
  int *piVar4;
  undefined1 *puVar5;
  undefined4 *puVar6;
  void *pvVar7;
  int *piVar8;
  uint uVar9;
  int iVar10;
  undefined4 *puVar11;
  uint uVar12;
  int iVar13;
  int iVar14;
  undefined4 *puVar15;
  undefined4 *puVar16;
  undefined4 *puVar17;
  int *piVar18;
  code *pcVar19;
  undefined1 *puVar20;
  uint unaff_retaddr;
  undefined1 auStack_78 [24];
  undefined4 local_60;
  int local_5c;
  undefined4 local_58;
  int *local_48 [2];
  uint local_40;
  uint local_3c;
  int *local_38;
  uint local_34;
  int **local_30;
  
  if ((param_2 & 3) == 0) {
    __dl_error_number = 9;
  }
  else {
    if (DAT_00022070 == '\0') {
      DAT_00022070 = '\x01';
      __dl_malloc_function = malloc;
      __dl_free_function = free;
    }
    if (param_1 == 0) {
      return __dl_symbol_tables;
    }
    piVar8 = __dl_symbol_tables;
    iVar3 = 0;
    while (piVar4 = __dl_symbol_tables, piVar8 != (int *)0x0) {
      iVar10 = *piVar8;
      uVar9 = *(uint *)(iVar10 + 0x14);
      if (uVar9 < unaff_retaddr) {
        if ((iVar3 == 0) || (*(uint *)(iVar3 + 0x14) < uVar9)) {
          piVar8 = (int *)piVar8[4];
          iVar3 = iVar10;
        }
        else {
          piVar8 = (int *)piVar8[4];
        }
      }
      else {
        piVar8 = (int *)piVar8[4];
      }
    }
    do {
      local_48[0] = piVar4;
      local_38 = local_48[0];
      if (local_48[0] == (int *)0x0) break;
      piVar4 = (int *)local_48[0][4];
    } while ((int *)local_48[0][4] != (int *)0x0);
    pcVar2 = getenv((char *)0x172c)   //possible issue identified - semgrep
    local_3c = 2;
    if (pcVar2 == (char *)0x0) {
      local_3c = param_2 & 2;
    }
    local_58 = 0;
    iVar3 = _dl_load_shared_library(0,local_48,iVar3,param_1);
    if (iVar3 == 0) {
      return (int *)0x0;
    }
    piVar4 = (int *)malloc(0x18)   //possible issue identified - semgrep
    iVar10 = 0x18;
    piVar8 = piVar4;
    while (bVar1 = iVar10 != 0, iVar10 = iVar10 + -1, bVar1) {
      *(undefined1 *)piVar8 = 0;
      piVar8 = (int *)((int)piVar8 + 1);
    }
    *piVar4 = iVar3;
    local_34 = param_2 & 4;
    *(uint *)(iVar3 + 0x24) = *(uint *)(iVar3 + 0x24) | local_34;
    piVar8 = __dl_handles;
    piVar18 = piVar4;
    piVar4[1] = (int)__dl_handles;
    __dl_handles = piVar18;
    if (1 < *(ushort *)(iVar3 + 0x20)) {
      while( true ) {
        if (piVar8 == (int *)0x0) {
          return piVar4;
        }
        if (*piVar8 == iVar3) break;
        piVar8 = (int *)piVar8[1];
      }
      iVar3 = piVar8[3];
      piVar4[2] = piVar8[2];
      piVar4[3] = iVar3;
      uVar9 = 0;
      while( true ) {
        iVar3 = uVar9 * 4;
        bVar1 = (uint)piVar4[3] <= uVar9;
        uVar9 = uVar9 + 1;
        if (bVar1) break;
        iVar3 = *(int *)(piVar4[2] + iVar3);
        *(uint *)(iVar3 + 0x24) = *(uint *)(iVar3 + 0x24) | local_34;
      }
      piVar4[4] = piVar8[4];
      return piVar4;
    }
    puVar20 = auStack_78;
    puVar15 = &local_60;
    *(ushort *)(iVar3 + 0x22) = *(ushort *)(iVar3 + 0x22) | 0x10;
    local_5c = iVar3;
    local_60 = 0;
    local_40 = 0;
    local_30 = local_48;
    puVar17 = puVar15;
    piVar8 = piVar4;
    puVar16 = puVar15;
    while (puVar17 != (undefined4 *)0x0) {
      *(undefined4 *)(puVar17[1] + 0x30) = 0;
      for (piVar18 = *(int **)(puVar17[1] + 8); *piVar18 != 0; piVar18 = piVar18 + 2) {
        puVar6 = puVar16;
        puVar5 = puVar20;
        if (*piVar18 == 1) {
          iVar13 = puVar17[1];
          iVar10 = piVar18[1];
          iVar14 = *(int *)(iVar13 + 0x54);
          *(undefined4 *)(puVar20 + 0x10) = 0;
          iVar10 = _dl_load_shared_library(0,local_30,iVar13,iVar10 + iVar14);
          if (iVar10 == 0) goto LAB_000115c8;
          *(uint *)(iVar10 + 0x24) = *(uint *)(iVar10 + 0x24) | local_34;
          puVar5 = (undefined1 *)malloc(0x18)   //possible issue identified - semgrep
          iVar13 = 0x18;
          piVar8[4] = (int)puVar5;
          while (bVar1 = iVar13 != 0, iVar13 = iVar13 + -1, bVar1) {
            *puVar5 = 0;
            puVar5 = puVar5 + 1;
          }
          piVar8 = (int *)piVar8[4];
          puVar5 = puVar20 + -0x10;
          *piVar8 = iVar10;
          *(int *)(puVar20 + 0xc) = iVar10;
          iVar13 = puVar17[1];
          *(undefined4 *)(puVar20 + 8) = *(undefined4 *)(iVar13 + 0x30);
          *(undefined1 **)(iVar13 + 0x30) = puVar20 + 8;
          for (puVar11 = puVar15; puVar11 != (undefined4 *)0x0; puVar11 = (undefined4 *)*puVar11) {
            if (iVar10 == puVar11[1]) {
              *(short *)(iVar10 + 0x20) = *(short *)(iVar10 + 0x20) + -1;
              goto LAB_00011318;
            }
          }
          puVar5 = puVar20 + -0x20;
          puVar6 = (undefined4 *)(puVar20 + -8);
          *puVar16 = puVar6;
          *(int *)(puVar20 + -4) = iVar10;
          *puVar6 = 0;
        }
LAB_00011318:
        puVar16 = puVar6;
        puVar20 = puVar5;
      }
      puVar17 = (undefined4 *)*puVar17;
      local_40 = local_40 + 1;
    }
    pvVar7 = malloc(local_40 << 2)   //possible issue identified - semgrep
    piVar4[2] = (int)pvVar7;
    piVar4[3] = local_40;
    iVar10 = 0;
    for (puVar17 = puVar15; puVar17 != (undefined4 *)0x0; puVar17 = (undefined4 *)*puVar17) {
      *(undefined4 *)((int)pvVar7 + iVar10 * 4) = puVar17[1];
      puVar16 = *(undefined4 **)(puVar17[1] + 0x30);
      while (puVar16 != (undefined4 *)0x0) {
        if ((*(uint *)(puVar16[1] + 0x24) & 4) == 0) {
          puVar6 = (undefined4 *)malloc(8)   //possible issue identified - semgrep
          puVar6[1] = puVar16[1];
          iVar13 = puVar17[1];
          *puVar6 = *(undefined4 *)(iVar13 + 0x34);
          *(undefined4 **)(iVar13 + 0x34) = puVar6;
          puVar16 = (undefined4 *)*puVar16;
        }
        else {
          puVar16 = (undefined4 *)*puVar16;
        }
      }
      iVar10 = iVar10 + 1;
    }
    for (; uVar9 = 0, puVar15 != (undefined4 *)0x0; puVar15 = (undefined4 *)*puVar15) {
      do {
        uVar12 = uVar9;
        uVar9 = uVar12 + 1;
      } while (*(int *)((int)pvVar7 + uVar12 * 4) != puVar15[1]);
      for (; uVar9 < local_40; uVar9 = uVar9 + 1) {
        iVar10 = *(int *)((int)pvVar7 + uVar9 * 4);
        puVar17 = *(undefined4 **)(iVar10 + 0x30);
        while( true ) {
          if (puVar17 == (undefined4 *)0x0) goto LAB_0001147c;
          if (puVar17[1] == puVar15[1]) break;
          puVar17 = (undefined4 *)*puVar17;
        }
        iVar13 = uVar9 - uVar12;
        while( true ) {
          iVar14 = iVar13 + uVar12;
          if (iVar13 == 0) break;
          iVar13 = iVar13 + -1;
          *(undefined4 *)((int)pvVar7 + iVar14 * 4) =
               *(undefined4 *)((1 - iVar14) * -4 + (int)pvVar7);
        }
        *(int *)((int)pvVar7 + uVar12 * 4) = iVar10;
        uVar12 = uVar12 + 1;
LAB_0001147c:
      }
    }
    _dl_perform_mips_global_got_relocations(iVar3,local_3c == 0);
    iVar3 = _dl_fixup(piVar4,local_3c);
    if (iVar3 == 0) {
      if (local_38 != (int *)0x0) {
        for (local_48[0] = (int *)local_38[4]; local_48[0] != (int *)0x0;
            local_48[0] = (int *)local_48[0][4]) {
          if (*(int *)(*local_48[0] + 0xe4) != 0) {
            _dl_protect_relro();
          }
        }
        local_48[0] = (int *)0x0;
      }
      uVar9 = local_40;
      if ((__dl_debug_addr != 0) &&
         (pcVar19 = *(code **)(__dl_debug_addr + 8), pcVar19 != (code *)0x0)) {
        *(undefined4 *)(__dl_debug_addr + 0xc) = 1;
        (*pcVar19)();
        *(undefined4 *)(__dl_debug_addr + 0xc) = 0;
        (*pcVar19)();
        uVar9 = local_40;
      }
      while (uVar9 != 0) {
        piVar8 = *(int **)((1 - uVar9) * -4 + (int)pvVar7);
        uVar9 = uVar9 - 1;
        if ((*(ushort *)((int)piVar8 + 0x22) & 4) == 0) {
          *(ushort *)((int)piVar8 + 0x22) = *(ushort *)((int)piVar8 + 0x22) | 4;
          if ((piVar8[0x1c] != 0) &&
             (pcVar19 = (code *)(piVar8[0x1c] + *piVar8), pcVar19 != (code *)0x0)) {
            (*pcVar19)();
          }
          _dl_run_init_array(piVar8);
        }
      }
      return piVar4;
    }
LAB_000115c8:
    (*(code *)0xad4)(piVar4,0);
  }
  return (int *)0x0;
}