Код сборки не выполняется из терминала после компиляции. Он отображается в одной папке? [Дубликат]

используете ли вы конфигурацию SMTP для отправки своей электронной почты? попробуйте вместо этого использовать phpmailer. вы можете загрузить библиотеку из https://github.com/PHPMailer/PHPMailer . Я создал электронную почту, отправив этот путь:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet="utf-8";
    $mail->IsSMTP();                                      // set mailer to use SMTP
    $mail->Host = "mail.example.com";  // specify main and backup server
    $mail->SMTPAuth = true;     // turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "me@walalang.com";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // set word wrap to 50 characters
    $mail->IsHTML(true);                                  // set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";    
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. 

"; echo "Mailer Error: " . $mail->ErrorInfo; exit; } echo "Message has been sent"; }

3
задан Michael Petch 19 March 2016 в 19:39
поделиться

1 ответ

В вашем коде есть признаки того, что вы, возможно, использовали учебник Linux при создании кода для OS / X (BSD). Linux и OS / X отличаются соглашениями SYSCALL . В 32-битных программах OS / X для int 0x80 требуются параметры (за исключением того, что syscall в EAX ) передается в стеке.

Важные вещи, о которых нужно знать с помощью 32 -бит SYSCALL s через int 0x80 в OS / X:

  • аргументы, переданные в стек, нажатые справа налево
  • вы должны выделить дополнительные 4 байта ( DWORD ) в стеке после того, как вы нажмете все аргументы
  • номер syscall в регистре eax
  • вызов прерыванием 0x80

После нажатия аргументов в стеке в обратном порядке для int 0x80 вы должны выделить дополнительные 4 байта ( DWORD ), в стеке. Значение в этой ячейке памяти в стеке не имеет значения. Это требование является артефактом из старого соглашения UNIX .

Список номеров SYSCALL и их параметров можно найти в APPLE файлы заголовков . Вам понадобятся эти SYSCALL s:

1 AUE_EXIT    ALL { void exit(int rval); }
3 AUE_NULL    ALL { user_ssize_t read(int fd, user_addr_t cbuf, user_size_t nbyte); } 
4 AUE_NULL    ALL { user_ssize_t write(int fd, user_addr_t cbuf, user_size_t nbyte); } 

Я прокомментировал некоторый пример кода, который будет похож по функциональности на то, что вы, возможно, были пытающихся достичь:

section .data
    ;New line string
    NEWLINE: db 0xa, 0xd
    LENGTH: equ $-NEWLINE

section .bss
    INPT: resd 1

global _start

section .text
_start:
    and     esp, -16      ; Make sure stack is 16 byte aligned at program start
                          ;     not necessary in this example since we don't call 
                          ;     external functions that conform to the OS/X 32-bit ABI

    push    dword 1       ; Read 1 character
    push    dword INPT    ; Input buffer
    push    dword 0       ; Standard input = FD 0
    mov     eax, 3        ; syscall sys_read
    sub     esp, 4        ; Extra 4 bytes on stack needed by int 0x80
    int     0x80
    add     esp, 16       ; Restore stack

    push    dword 1       ; Print 1 character
    push    dword INPT    ; Output buffer = buffer we read characters into
    push    dword 1       ; Standard output = FD 1
    mov     eax, 4        ; syscall sys_write
    sub     esp, 4        ; Extra 4 bytes on stack needed by int 0x80
    int     0x80
    add     esp, 16       ; Restore stack

    push    dword LENGTH  ; Number of characters to write
    push    dword NEWLINE ; Write the data in the NEWLINE string
    push    dword 1       ; Standard output = FD 1
    mov     eax, 4        ; syscall sys_write
    sub     esp, 4        ; Extra 4 bytes on stack needed by int 0x80
    int     0x80
    add     esp, 16       ; Restore stack

    push    dword 0       ; Return value from program = 0
    mov     eax, 1        ; syscall sys_exit
    sub     esp, 4        ; Extra 4 bytes on stack needed by int 0x80
    int     0x80

and esp, -16 необходимо, только если вам нужно выровнять стек с 16-байтовой границей в качестве базовой линии для будущих операций стека. Если вы намереваетесь вызывать внешние функции, которые соответствуют OS / X 32-битовому ABI , ожидается, что стек будет выровнен по 16 байт непосредственно перед функцией CALL . Это выравнивание не требуется для системных вызовов через int 0x80.

Вы должны иметь возможность собирать и связывать его с:

nasm -f macho32 test.asm -o test.o
ld -macosx_version_min 10.9.0 -o test test.o -e _start -lSystem

И запустите его с помощью:

./test
5
ответ дан Michael Petch 22 August 2018 в 18:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: